2010-04-26 55 views
4

我有点WPF noob,所以在这个问题上的任何固有的愚蠢道歉(!)双击可编辑的WPF treeview项目? (与样式?)

我试图启用编辑的WPF treeview标签与doubleclick - 已经搜索了这个,看起来这样做的两种方式是使用自定义控件或隐藏TextBox/TextBlock之一的样式。

使用样式将标签设置为基于DataTrigger的文本框似乎很容易(例如下面的1),但这意味着任何时候选中某行,它都会被“编辑”。

我真的很想做的事情是在mousedoubleclick事件上启用这个(过渡到文本框),但似乎EventTriggers不能以下面的方式使用,因为它们是瞬态的。 (似乎我无法在代码隐藏中简单地使用DoubleClick事件,因为它不会(?)允许我影响显示的控件以显示/隐藏文本框)。

使用一个完全成熟的自定义控件看起来像另一种选择 - 这里有一个AAALMOST工作示例(http://www.codeproject.com/KB/WPF/editabletextblock.aspx),但它不HierachicalDataTemplate条款的存在工作(和它看起来并不像一个解决办法是即将出版) 。

(如1 - 如果选择从文本块到文本框开关)

<Window x:Class="treetest.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:treetest" 
Title="Window1" Height="300" Width="300"> 
<Window.Resources> 
    <Style x:Key="EditableContentControl" TargetType="{x:Type ContentControl}"> 
     <Setter Property="ContentTemplate"> 
      <Setter.Value> 
       <DataTemplate DataType="{x:Type local:CompositeViewModel}"> 
        <TextBlock Text="{Binding Path=Name}" /> 
       </DataTemplate> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=IsSelected,RelativeSource=RelativeSource AncestorType={x:Type TreeViewItem}}}" 
       Value="True"> 
       <Setter Property="ContentTemplate"> 
        <Setter.Value> 
         <DataTemplate DataType="{x:Type local:CompositeViewModel}"> 
          <TextBox Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged}" /> 
         </DataTemplate> 
        </Setter.Value> 
       </Setter>     
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 
<Grid> 
    <TreeView Margin="12,12,115,12" Name="treeView1" 
       ItemsSource="{Binding Path=GetRootData}" 
       > 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate DataType="{x:Type local:CompositeViewModel}" ItemsSource="{Binding Path=Children}"> 
       <ContentControl Content="{Binding}" Style="{StaticResource EditableContentControl}"/> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 
</Grid> 
</Window> 

回答

4

它帮助:

 string name = "some name"; 
     var treeItem = new TreeViewItem() 
      { 
       Header = name, 
      }; 
     var textBox = new TextBox() 
      { 
       Text = name, 
      }; 
     treeItem.MouseDoubleClick += (o, e) => 
      { 
       TreeItem.Header = textBox; 
      }; 
     textBox.LostFocus += (o, e) => 
      { 
       treeItem.Header = textBox.Text; 
       name = textBox.Text; 
      }; 

它很简单,它精美的作品对我来说。

0

如果不是在IsSelected上触发,而是像IsEditing那样触发绑定数据的自定义属性?然后,您可以将IsEditing设置为true,以便随时更改(例如,在您的情况下,单击鼠标按钮时)。

0

看看来自Blend的CallActionMethod。这种特殊的触发器可以让您在任何事件(如双击和后面的代码中的某个方法)之间建立松散的链接。

如果您更喜欢使用命令,那么您可以使用InvokeCommandAction。您可以将任何命令连接到事件。