.net WPF TreeView清除选择
如何清除WPF树视图中的树视图选择?我已尝试循环遍历.net WPF TreeView清除选择,.net,wpf,treeview,.net,Wpf,Treeview,如何清除WPF树视图中的树视图选择?我已尝试循环遍历树节点并清除IsSelected属性,但这是一个只读属性。有什么想法吗 TreeView正在通过XMLDataProvider对象使用XML绑定。不确定TreeNodes是什么意思 通常,视图绑定到的视图模型上会有相应的IsSelected属性: <TreeView> <TreeView.ItemContainerStyle> <Style TargetType="TreeViewItem"
树节点
并清除IsSelected
属性,但这是一个只读
属性。有什么想法吗
TreeView
正在通过XMLDataProvider
对象使用XML绑定。不确定TreeNodes是什么意思
通常,视图绑定到的视图模型上会有相应的IsSelected
属性:
<TreeView>
<TreeView.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="IsSelected" Value="{Binding IsSelected}"/>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
查找所选项目并设置值:
private void Button_Click(object sender, RoutedEventArgs e)
{
TreeViewItem tvi = treeviewExample.SelectedItem as TreeViewItem;
if (tvi != null)
{
tvi.IsSelected = false;
}
}
我遇到了完全相同的问题,并编写了以下代码,这些代码将适用于任何treeview,只需对第一个函数进行一行调用
class TomWrightsUtils
{
public static void ClearTreeViewSelection(TreeView tv)
{
if (tv != null)
ClearTreeViewItemsControlSelection(tv.Items, tv.ItemContainerGenerator);
}
private static void ClearTreeViewItemsControlSelection(ItemCollection ic, ItemContainerGenerator icg)
{
if ((ic != null) && (icg != null))
for (int i = 0; i < ic.Count; i++)
{
TreeViewItem tvi = icg.ContainerFromIndex(i) as TreeViewItem;
if (tvi != null)
{
ClearTreeViewItemsControlSelection(tvi.Items, tvi.ItemContainerGenerator);
tvi.IsSelected = false;
}
}
}
}
class-TomWrightsUtils
{
公共静态无效ClearTreeView选举(TreeView电视)
{
如果(电视!=null)
ClearTreeViewItems控件选择(tv.Items、tv.ItemContainerGenerator);
}
私有静态无效ClearTreeViewItemsControlSelection(ItemCollection ic、ItemContainerGenerator icg)
{
如果((ic!=null)&(icg!=null))
对于(int i=0;i
到目前为止,这似乎是可行的,但我5分钟前刚把它放进去,所以使用风险自负。我基本上想在用户在树控件中单击时清除选择,但不是在树项上
void DestinationTree_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
TreeView tree = sender as TreeView;
DestinationClientViewModel selectedItem = tree.SelectedItem as DestinationClientViewModel;
if (selectedItem != null)
{
int selectedItemIndex = this.DestinationTree.Items.IndexOf(selectedItem);
if (selectedItemIndex > -1)
{
TreeViewItem tvi = this.DestinationTree.ItemContainerGenerator.ContainerFromIndex(selectedItemIndex) as TreeViewItem;
if (tvi != null)
tvi.IsSelected = false;
}
}
}
这是一个很好的扩展方法,因此您可以调用
youTreeview.ClearSelection();
using System.Windows.Forms;
using System.Windows.Controls;
namespace YourAppNamespace
{
public static void ClearSelection(this TreeView input)
{
// this should be some container that you put in
// possibly the actual treeviewitem, not sure on that though
var selected = input.SelectedItem;
if (selected == null)
return;
// in my case this works perfectly
var tvi = input.ItemContainerGenerator.ContainerFromItem(selected) as TreeViewItem;
var tvi = input.ItemContainerGenerator.ContainerFromItem(selected) as TreeViewItem;
if (tvi == null)
{
// it must be a child, heres a hack fix
// my nodes are inherited from TreeViewItemViewModel by Josh Smith
var child = selected as WPF.Controls.TreeViewItemViewModel;
if (child == null)
return;
child.IsSelected = false;
}
else
tvi.IsSelected = false;
}
}
我的经验是远离标准的ItemContainerGenerator调用,因为它们在深度大于n+1的节点上会失败。我使用以下扩展方法的组合。ContainerFromItem扩展方法来自一个MSDN博客,它在处理TreeView时为我创造了奇迹
public static void ClearSelection(this TreeView input)
{
var selected = input.SelectedItem;
if (selected == null) return;
var tvi = input.ContainerFromItem(selected) as TreeViewItem;
if (tvi == null) return;
tvi.IsSelected = false;
}
public static TreeViewItem ContainerFromItem(this TreeView treeView, object item)
{
TreeViewItem containerThatMightContainItem = (TreeViewItem)treeView.ItemContainerGenerator.ContainerFromItem(item);
if (containerThatMightContainItem != null)
return containerThatMightContainItem;
else
return ContainerFromItem(treeView.ItemContainerGenerator, treeView.Items, item);
}
private static TreeViewItem ContainerFromItem(ItemContainerGenerator parentItemContainerGenerator, ItemCollection itemCollection, object item)
{
foreach (object curChildItem in itemCollection)
{
TreeViewItem parentContainer = (TreeViewItem)parentItemContainerGenerator.ContainerFromItem(curChildItem);
if (parentContainer == null)
return null;
TreeViewItem containerThatMightContainItem = (TreeViewItem)parentContainer.ItemContainerGenerator.ContainerFromItem(item);
if (containerThatMightContainItem != null)
return containerThatMightContainItem;
TreeViewItem recursionResult = ContainerFromItem(parentContainer.ItemContainerGenerator, parentContainer.Items, item);
if (recursionResult != null)
return recursionResult;
}
return null;
}
我自己也遇到过这种情况,在寻找了很长时间后,我终于找到了一个适合我的解决方案 有关详细解释,请访问 基本思想是捕获
TreeViewItem.Selected
事件,并将事件源保存到TreeView上的Tag
属性中。然后,当需要清除它时,可以访问控件上的标记
属性,并将IsSelected
值设置为False。这对我来说适用于两级嵌套子级。希望它对你有用
为了持久性起见:
TreeView宣言
<TreeView Name="myTreeView" TreeViewItem.Selected="OnItemSelected"
ItemsSource="{Binding Source={StaticResource myHierarchicalData}}"/>
清晰选择逻辑
if (myTreeView.SelectedItem != null)
{
TreeViewItem selectedTVI = myTreeView.Tag as TreeViewItem;
// add your code here mine was selectedTVI.IsSelected = false;
}
我只是遇到了同样的问题 又快又脏的解决办法
tree.ItemsSource = null;
tree.ItemsSource = yourSource;
忽略我的代码。仅在根级别有效。选择的任何子节点都不会被清除。我正在拼命寻找一种方法来选择树视图的第一个索引。我尝试了上面的解决方案(ContainerFromIndex),但它返回null。有什么帮助吗?这是唯一真正的解决方案清晰简洁应该是选择的答案这是一个解决方案,简短,但感觉肮脏。通过选择根来取消选择,然后再次取消选择。不过,这可能比在树上行走更有效。
if (myTreeView.SelectedItem != null)
{
TreeViewItem selectedTVI = myTreeView.Tag as TreeViewItem;
// add your code here mine was selectedTVI.IsSelected = false;
}
tree.ItemsSource = null;
tree.ItemsSource = yourSource;
TreeViewItem tvi = tvMain.ItemContainerGenerator.ContainerFromIndex(0) as TreeViewItem;
if (tvi != null) { tvi.IsSelected = true; tvi.IsSelected = false; }