TreeViewItem.ItemContainerGenerator.ContainerFromItem结果不一致

Fer*_*min 2 silverlight treeview silverlight-4.0

我的页面上有一个TreeView.它绑定到包含合同的客户端集合,例如:

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; }
}
Run Code Online (Sandbox Code Playgroud)

我的TreeView的XAML如下:

<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>
Run Code Online (Sandbox Code Playgroud)

ClientContracts是一个List<Clients>.绑定工作正常,我有一个分层网格.

我遇到的问题是打开带有TreeView的表单时我想选择当前的Client,我目前使用以下代码:

TreeViewItem client = (TreeViewItem)tvClientContract.ItemContainerGenerator.ContainerFromItem(aClient);
Run Code Online (Sandbox Code Playgroud)

要么

TreeViewItem client = (TreeViewItem)tvClientContract.ItemContainerGenerator.ContainerFromIndex(tvClientContract.Items.IndexOf(aClient));
client.IsSelected = true;
Run Code Online (Sandbox Code Playgroud)

但这会返回不一致的结果,例如我选择客户端'ABC'时打开表单,客户端将为null.当选择客户端'ABC'并且它返回正确的TreeViewItem时,我再次打开它.有没有人以前遇到过这个或知道我能看到什么来帮助解决这个问题?

我在TreeView的Loaded事件中运行上面的代码.

Fer*_*min 7

我弄清楚这里发生了什么,线索在MSDN文档中的返回值为ItemContainerGenerator.ContainerFromItem():

与给定项目对应的UIElement.如果项不属于项集合,或者尚未为其生成UIElement,则返回null.

看起来当返回null时,尚未为该项创建UIElement.

我用它来绕过这个

tvClientContract.UpdateLayout();

更新布局并确保在调用之前存在UIElement

ItemContainerGenerator.ContainerFromItem()
Run Code Online (Sandbox Code Playgroud)