我對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