我有一个带有层次数据模板的WPF TreeView。
目前,我必须双击项目才能展开/折叠它。
我想将此行为更改为单击,而不会失去其他功能。因此,它应该在单击时展开和折叠。
有什么推荐的方法吗?
谢谢!
我有一个带有层次数据模板的WPF TreeView。
目前,我必须双击项目才能展开/折叠它。
我想将此行为更改为单击,而不会失去其他功能。因此,它应该在单击时展开和折叠。
有什么推荐的方法吗?
谢谢!
您可以使用重新模板化的复选框作为节点(包含您当前使用的任何模板),并将其IsChecked属性绑定到TreeViewItem的IsExpanded属性。
这是一个我刚测试过似乎能够完成工作的模板:
<HierarchicalDataTemplate ItemsSource="{Binding Items}">
<CheckBox IsChecked="{Binding RelativeSource={RelativeSource AncestorType=TreeViewItem}, Path=IsExpanded}">
<CheckBox.Template>
<ControlTemplate>
<TextBlock Text="{Binding Header}"></TextBlock>
</ControlTemplate>
</CheckBox.Template>
</CheckBox>
</HierarchicalDataTemplate>
只需使用您需要的内容替换ControlTemplate的内容即可。
如果您正在使用标准的TreeViewItem
,那么您可以捕获点击事件:
private void OnTreeViewMouseUp( object sender, MouseButtonEventArgs e )
{
var tv = sender as TreeView;
var item = tv.SelectedItem as TreeViewItem;
if( item != null )
item.IsExpanded = !item.IsExpanded;
e.Handled = true;
}
private void OnTreeViewPreviewMouseDoubleClick( object sender, MouseButtonEventArgs e )
{
e.Handled = true;
}
在你的情况下,你很可能需要处理绑定和ViewModel。这里有一篇来自CodePlex的好文章:通过使用ViewModel模式简化WPF TreeView。
只需使用所选项目更改事件并使用以下内容:
private void treeview_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
TreeViewItem item = (TreeViewItem)treeview.SelectedItem;
item.IsExpanded = true;
}
如果treeview是您的TreeView的名称,您可以根据其当前状态包含if语句以关闭/打开。
Metro Smurf的答案(感谢他让我达到了目标)提供了正确的方法。您可以简单地连接到TreeView的SelectedItemChanged事件。然后将传递给事件处理程序的e.NewValue强制转换为TreeViewItem,并访问其IsExpanded属性以将其设置为true。
void MyFavoritesTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
((TreeViewItem)e.NewValue).IsExpanded = true;
}
var item = tv.SelectedItem as TreeViewItem;
item.Expanded += item_Expanded;
然后在事件处理程序中执行您需要执行的任何操作
void item_Expanded(object sender, RoutedEventArgs e)
{
// handle your stuff
}
到目前为止,我在使用WPF方面的经验非常少,因此我不确定这里是否有100%的正确性。但是,您可以查看TreeView和TreeViewItem的.HitTest方法(WPF Treeview基本上是Windows.Controls.Treeview,对吧?或者是一个衍生类?)。
.HitTest方法在标准的Windows.Forms.Treeview(我正在使用VS 2008)中并不总是自动出现在Intellisense菜单中,直到您输入大部分方法名称。但是它应该在那里。您可能需要进行实验。
您可以使用.HitTest方法来处理MouseDown事件并返回对所选treeview项的引用。但是,您必须测试返回值是否为空,以防用户单击包含无树项的控件区域。一旦您拥有对特定项的引用,就应该能够将其.expanded属性设置为当前相反的值。在这里可能需要进行一些实验。
正如我所说,我实际上还没有使用过WPF,因此我可能错了......