我对WPF有一个相当有趣的问题。我有一个树形视图,选择项目到目前为止工作得很好。问题是,我想在用户点击树形视图的空白区域时取消选择当前选定的项目。默认情况下,树形视图保持当前的项目选择,我添加了一个上下文菜单选项来取消它,这是相当硬派:如何在点击某个空白区域时取消选择WPF树视图中的所有选定项目?
// Note: This is done recursivly from the start, so it
// works for child items as well
treeView.ItemContainerGenerator.ContainerFromItem(treeView.SelectedItem) as TreeViewItem).IsSelected = false;
此外,这是反直觉的,因为它需要用户右键单击第一个,第二个,用这种方式取消选择后,用户不能再通过单击该项目来选择它。这应该如何工作?
编辑:一些详细信息:我添加了一个处理程序的TreeView
处理鼠标点击事件,但发件人始终是一个TreeView
情况下,即使我直接点击一个TreeViewItem
。如果我为TreeView.ItemTemplate
(即模板中的第一个孩子)添加处理程序,则当我单击空白区域(这非常合理)时,我从不收到事件。代码如下所示:
private void MyTreeView_MouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
if ((sender as TreeViewItem) == null)
{
// Always triggered
System.Diagnostics.Trace.Write("Empty area clicked");
}
}
而且这样做的XAML是:
<TreeView x:Name="MyTreeView" Margin="3" MouseUp="MyTreeView_MouseUp">
不起作用,因为在选择一个项目后,发件人会绑定到当前选定的项目 - 即,即使我点击空白区域,发件人==当前选定的项目。 – Anteru 2009-01-30 08:51:14
嗯。如果您单击TreeView本身,发件人应该是TreeView(而不是TreeViewItem)。您是否将此处理程序添加到TreeView或每个TreeViewItem?你使用标准的TreeView还是自定义的? – Pwninstein 2009-01-30 12:24:31
啊,问题是我没有得到一个TreeViewItem,而是我的viewmodel类的一个实例,为此我必须找到相应的TreeViewItem。更糟糕的是,在以编程方式取消选择某个项目后,我无法通过单击进行重新选择。 – Anteru 2009-01-30 13:46:45