我試圖通過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