【问题标题】:TreeViewItem.ItemContainerGenerator.ContainerFromItem inconsistent resultsTreeViewItem.ItemContainerGenerator.ContainerFromItem 结果不一致
【发布时间】:2010-07-29 14:10:46
【问题描述】:

我的页面上有一个 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; }
}

我的 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>

其中 ClientContracts 是 List&lt;Clients&gt;。绑定工作正常,我有一个分层网格。

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

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

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

但这会返回不一致的结果,例如我在选择客户端“ABC”时打开表单并且客户端将为空。 I open it again when client 'ABC' is selected and it returns the correct TreeViewItem.有没有人遇到过这个问题或者知道什么可以帮助解决这个问题?

我在 TreeView 的 Loaded 事件中运行上述代码。

【问题讨论】:

    标签: silverlight treeview silverlight-4.0


    【解决方案1】:

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

    一个 UIElement 对应于 给定的项目。如果项目返回 null 不属于该项目 集合,或者如果 UIElement 没有 为它生成。

    看起来当返回 null 时,还没有为该项目创建 UIElement。

    我通过使用解决了这个问题

    tvClientContract.UpdateLayout();

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

    ItemContainerGenerator.ContainerFromItem()
    

    【讨论】:

    • 感谢您提供有关 UpdateLayout() 的提示。
    【解决方案2】:

    我认为在某些情况下“UpdateLoayout 不起作用”: 如果 TreeView 处于回收模式并且项目不在可见部分和/或也在“添加”操作中,其中 TreeViewItem 是在另一个线程上创建的。

    解决方案是使用我在以下描述的类似解决方案: WPF: Select TreeViewItem broken past the root level

    【讨论】:

      猜你喜欢
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      • 2019-09-05
      • 2021-03-27
      • 2021-07-03
      相关资源
      最近更新 更多