我有点像WPF菜鸟,所以对这个问题中任何固有的愚蠢道歉(!)
我正在尝试使用双击启用WPF树视图标签的编辑 - 我已经用Google搜索了这个,看起来这两种方式是使用自定义控件或隐藏其中一个TextBox的样式/ TextBlock的。
使用样式将标签设置为基于DataTrigger的textBox似乎很容易(例如下面的1),但这意味着无论何时选择行,它都会被“编辑”。
我真正想做的是在moused双击事件上启用此功能(切换到文本框),但似乎不能以下面的方式使用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>
答案 0 :(得分: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;
};
它很简单,对我很好。
答案 1 :(得分:0)
如果不是在IsSelected上触发,而是触发绑定数据的自定义属性(如IsEditing),该怎么办?然后,只要您想要更改,就可以将IsEditing设置为true(例如,在您的情况下,单击鼠标按钮时)。
答案 2 :(得分:0)
从Blend查看CallActionMethod。这个特殊的触发器可以让你在任何事件之间建立一个松散的链接,比如双击和后面代码中的方法。
如果您更喜欢使用命令,那么您可以使用InvokeCommandAction执行相同操作。您可以将任何命令连接到事件。