我试图通过ID选择TreeViewItem,但有问题让它通过第一个(根)级别工作。我已经完成了很多关于此的阅读,并且正在使用下面的方法。WPF:Select TreeViewItem打破了根级
private static bool SetSelected(ItemsControl parent, INestable itemToSelect) {
if(parent == null || itemToSelect == null) {
return false;
}
foreach(INestable item in parent.Items) {
if(item.ID == itemToSelect.ID) { // just comparing instances failed
TreeViewItem container = parent.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
if(container != null) {
container.IsSelected = true;
container.Focus();
return true;
}
}
ItemsControl childControl = parent.ItemContainerGenerator.ContainerFromItem(item) as ItemsControl;
if(SetSelected(childControl, itemToSelect))
return true;
}
return false;
}
INestable是基础级接口,通过IGroup和IAccount实施:
public interface INestable {
string ID { get; set; }
...
}
public interface IAccount : INestable {
...
}
public interface IGroup : INestable {
public IList<INestable> Children
...
}
我认为,必须有一些做的的DataTemplates(也许):
<HierarchicalDataTemplate DataType="{x:Type loc:IGroup}" ItemsSource="{Binding Children}" x:Key="TreeViewGroupTemplate">
<HierarchicalDataTemplate DataType="{x:Type loc:IAccount}" x:Key="TreeViewAccountTemplate">
The Template selector for the treeview returns thr group template for IGroups and the account template for IAccounts:
<conv:TreeTemplateSelector x:Key="TreeTemplateSelector" AccountTemplate="{StaticResource TreeViewAccountTemplate}" GroupTemplate="{StaticResource TreeViewGroupTemplate}"/>
<TreeView ItemTemplateSelector="{StaticResource TreeTemplateSelector}">
它适用于所有顶级项目,并且调试确认parent.ItemContainerGenerator不包含所有级别的项目。
我知道有很多的代码,但我正在烧几个小时试图让这个工作。谢谢你的帮助。 :)
谢谢,非常完美。 – Echilon 2009-12-18 14:27:34
你能帮我实现与虚拟化树视图同样的事情吗?VirtualizingStackPanel.IsVirtualizing =“True” VirtualizingStackPanel.VirtualizationMode =“Recycling” – akjoshi 2010-08-10 13:37:20