2010-07-29 92 views
2

我的頁面上有一個TreeView。它必然包含合同,像客戶的集合:TreeViewItem.ItemContainerGenerator.ContainerFromItem不一致的結果

public class Client 
{ 
    public int ClientID { get; set; } 
    public string Name { get; set; } 
    public List<Contract> Contracts { get; set; } 
} 

public class Contract 
{ 
    public int ContractID { get; set; } 
    public int ClientID { get; set; } 
    public string Name { get; set; } 
} 

的XAML我的TreeView如下:

<sdk:TreeView x:Name="tvClientContract" ItemsSource="{Binding ClientContracts}"> 
    <sdk:TreeView.ItemTemplate> 
    <sdk:HierarchicalDataTemplate ItemsSource="{Binding Path=Contracts}"> 
     <TextBlock Text="{Binding Path=Name}" /> 
    </sdk:HierarchicalDataTemplate> 
    </sdk:TreeView.ItemTemplate> 
</sdk:TreeView> 

凡ClientContracts是List<Clients>。綁定工作正常,我有一個分層網格。

是我遇到的問題是與TreeView控件就可以打開表單時,我想選擇當前客戶端,我目前使用下面的代碼:

TreeViewItem client = (TreeViewItem)tvClientContract.ItemContainerGenerator.ContainerFromItem(aClient); 

TreeViewItem client = (TreeViewItem)tvClientContract.ItemContainerGenerator.ContainerFromIndex(tvClientContract.Items.IndexOf(aClient)); 
client.IsSelected = true; 

但這會返回不一致的結果,例如,當客戶端'ABC'被選中且客戶端將爲空時,我打開表單。當客戶端'ABC'被選中並且它返回正確的TreeViewItem時,我再次打開它。有沒有人遇到過這個或知道任何我可以看看來幫助解決這個問題?

我在TreeView的Loaded事件中運行上面的代碼。

回答

7

我想通了,這裏發生了什麼,線索是MSDN文檔的ItemContainerGenerator.ContainerFromItem()返回值:

一個的UIElement對應於 給定項目。如果項目 不屬於項目 集合,或者UIElement未爲其生成 ,則返回空值。

它看起來像返回null時,還沒有爲物品創建UIElement。

我得到了這一輪通過

tvClientContract.UpdateLayout();

更新佈局和保證的UIElement調用

ItemContainerGenerator.ContainerFromItem() 
+0

感謝您給我們提示有關UpdateLayout請()。 – Tony 2011-05-03 23:36:51

+0

真棒,謝謝你,你救了我的一天! – 2011-07-22 14:42:11

0

之前就存在,我認爲,有可能是一些條件,其中「UpdateLoayout不會工作「: 如果TreeView處於回收模式並且該項目不在可見部分中,並且/或者也在另一個線程上創建TreeViewItem的」添加「操作中。

的解決方案是爲我描述了使用類似的解決方案: WPF: Select TreeViewItem broken past the root level