我有一个三级树视图.如何从代码中选择第三级中的任何项目?我尝试了许多博客和stackoverflow中提到的方法,但它似乎只适用于第一级(对于第一级以下的项目,dbObject为null).
这是我用来选择TreeViewItem的代码.我错过了什么吗?
public static void SetSelectedItem(this TreeView control, object item)
{
try
{
var dObject = control.ItemContainerGenerator.ContainerFromItem(item);
//uncomment the following line if UI updates are unnecessary
((TreeViewItem)dObject).IsSelected = true;
MethodInfo selectMethod = typeof(TreeViewItem).GetMethod("Select",
BindingFlags.NonPublic | BindingFlags.Instance);
selectMethod.Invoke(dObject, new object[] { true });
}
catch { }
}
Run Code Online (Sandbox Code Playgroud)
And*_*ndy 33
另一种选择是使用绑定.如果您有一个使用绑定的对象来获取每个对象的文本TreeViewItem(例如),则可以创建一个也绑定该IsSelected属性的样式:
<TreeView>
<TreeView.Resources>
<Style TargetType="TreeViewItem">
<Setter Property="IsSelected"
Value="{Binding Path=IsSelected, Mode=TwoWay}" />
</Style>
</TreeView.Resources>
</TreeView>
Run Code Online (Sandbox Code Playgroud)
这假设绑定对象具有IsSelected类型的属性bool.然后,您可以选择TreeViewItem通过设置IsSelected到true其相应的对象.
可以使用相同的方法与IsExpanded属性一起控制何时TreeViewItem展开或折叠.
您可以使用以下TreeView扩展名,我发现这是一个更简单的解决方案:
public static class TreeViewExtension
{
public static bool SetSelectedItem(this TreeView treeView, object item)
{
return SetSelected(treeView, item);
}
private static bool SetSelected(ItemsControl parent, object child)
{
if (parent == null || child == null)
return false;
TreeViewItem childNode = parent.ItemContainerGenerator
.ContainerFromItem(child) as TreeViewItem;
if (childNode != null)
{
childNode.Focus();
return childNode.IsSelected = true;
}
if (parent.Items.Count > 0)
{
foreach (object childItem in parent.Items)
{
ItemsControl childControl = parent
.ItemContainerGenerator
.ContainerFromItem(childItem)
as ItemsControl;
if (SetSelected(childControl, child))
return true;
}
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请阅读此博客文章; http://decompile.it/blog/2008/12/11/selecting-an-item-in-a-treeview-in-wpf/
| 归档时间: |
|
| 查看次数: |
41649 次 |
| 最近记录: |