2014-09-26 58 views
0

的我有以下XAML一個TreeView獲取位置選擇樹型視圖

<TreeView ItemsSource="{Binding Folders, UpdateSourceTrigger=PropertyChanged}" x:Name="tree"> 
    <TreeView.InputBindings> 
     <KeyBinding Key="Delete" 
        Command="{Binding DataContext.DeleteFolderCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}" 
        CommandParameter="{Binding ElementName=tree, Path=SelectedItem}"/> 
     <KeyBinding Key="F2" 
        Command="{Binding DataContext.RenameFolderCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}" 
        CommandParameter="{Binding ElementName=tree, Path=SelectedItem}"/> 
    </TreeView.InputBindings> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Folders, UpdateSourceTrigger=PropertyChanged}"> 
      <Grid> 
       <Label Content="{Binding Name}"> 
        <Label.ContextMenu> 
         <ContextMenu> 
          <MenuItem Header="Rename" 
             Command="{Binding DataContext.RenameFolderCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}" 
             CommandParameter="{Binding ElementName=tree, Path=SelectedItem}"/> 
          <MenuItem Header="Delete" 
             Command="{Binding DataContext.DeleteFolderCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}" 
             CommandParameter="{Binding ElementName=tree, Path=SelectedItem}"/> 
         </ContextMenu> 
        </Label.ContextMenu> 
        <Label.InputBindings> 
         <MouseBinding MouseAction="LeftDoubleClick" 
          Command="{Binding DataContext.SelectFolderCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}" 
          CommandParameter="{Binding ElementName=tree, Path=SelectedItem}" /> 
        </Label.InputBindings> 
       </Label> 
      </Grid> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

在上重命名一個點擊(或按下F2)上TreeViewItem我想用一個TextBox更換標籤。

這樣做的最好方法是什麼?

我已經試圖獲得TreeView的SelectedItem的PositionBounds,但這是Folder的一個實例,所以我無法在那裏獲取信息。

+0

你可以使用'Control'並在'Style'中設置'Template'。在樣式中,您可以使用具有適合條件的內容的「ControlTemplate」。 HTH – XAMlMAX 2014-09-26 14:11:52

回答

0

我發現實現所需功能的更好方法是永久使用TextBox,但其IsReadOnly屬性設置爲true。您可以將TextBox.IsReadOnly屬性設置爲True以使其可編輯,而不是將Label換成TextBox

此外,您還可以添加Style Setter s到讓TextBox看起來像它不是一個TextBox當它是不可編輯:

<Style x:Key="TextBlockStyle" TargetType="{x:Type TextBox}"> 
    <Style.Triggers> 
     <Trigger Property="IsReadOnly" Value="True"> 
      <Setter Property="Background" Value="{x:Null}" /> 
      <Setter Property="BorderBrush" Value="{x:Null}" /> 
      <Setter Property="BorderThickness" Value="0" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

然後,您可以數據從後面的代碼或視圖綁定bool IsEditable屬性模型改變TextBox是否應該爲可編輯與否:

<TextBox Text="{Binding SomeTextProperty}" IsReadOnly="{Binding IsEditable}" ... /> 

然後,所有你需要做的,使現場編輯的是這樣的(在後面或vi代碼ew模型):

IsEditable = true; 
0

您最創建一個像編輯框一樣的可編輯模式的UserControl並更改模式運行時。 對於一些類似的目的,我更改了組合框模板並構建了自己的控件。

順便說一句,我建議看看組合框控件模板。 (可以編輯或不可編輯)