【问题标题】:Expand Root in TreeView when ItemSource changedItemSource 更改时在 TreeView 中展开 Root
【发布时间】:2011-08-06 04:55:25
【问题描述】:

我在 Silverlight 4 应用程序中有一个带有 TreeView 的 ChildWindow。 ItemSource 绑定到 ViewModel 中项目的 ObservableCollection。当窗口打开时,项目从 web 服务加载。

我只有一个根节点,我需要先扩展它。 TreeView 甚至有扩展名 ExpandToDepth() 看起来很完美,但我不知道在哪里可以调用它。我没有找到从 ItemSource 更新项目后发生的事件。

我尝试在 TreeView 中使用 ItemContainerGenerator.ItemChanged 和 OnItemsChanged,但它们都是在生成树视图项之前执行的,因此展开命令将不起作用。

我怎样才能让它工作?

【问题讨论】:

    标签: silverlight data-binding mvvm treeview


    【解决方案1】:

    尝试注册您的 ObservableCollection 的 CollectionChange 事件并在那里执行您的操作。

    【讨论】:

    • 如果我在 collectionChanged 中调用扩展操作或在 ViewModel 中设置 itemSoure 属性后立即调用它们,则扩展操作不起作用。我尝试了以下代码:var x = treeView.ContainerFromItem(treeView.Items[0]); x.IsExpanded = true; 当我在 collectionChanged 之后执行它时,根节点已经在 Items 但还没有容器。稍后从按钮单击事件调用这工作正常。在执行此操作之前,我不知何故需要等待 treeView 创建容器并将它们添加到控件中。
    • 如果您的 TreeView 项目有项目模板,那么您可以注册项目的 Loaded 事件,并且在处理程序中您可以将 TreeView 的 IsExpanded 设置为 true。确保您过滤掉所有其他项目的 Loaded 事件您可以将控件的 Tag 属性绑定到 DataContext 并在处理程序中还检查发送方的 Tag 是否是 ItemsSource 的第一个元素。
    【解决方案2】:

    从 TreeView 派生并创建 IsRootItemExpanded 属性并在 ViewModel 中创建同名属性。在设置访问器中检查值是否为真,然后像这样调用您的方法 ExpandToDepth(1) 当 itemssource 需要更新时,将 IsRootItemExpanded 属性设置为真。必须将 TreeView 的 IsRootItemExpanded 绑定到 ViewModel 的 IsRootItemExpanded。

    【讨论】:

      【解决方案3】:

      我通过覆盖 TreeView 中的 PrepareContainerForItemOverride 方法解决了我的问题。我想知道为什么这只是为根节点调用但它有效。

      public class ExpandedRootTreeView : TreeView
      {
          protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
          {
              TreeViewItem treeViewItem = element as TreeViewItem;
      
              if (treeViewItem != null) treeViewItem.IsExpanded = true;
      
              base.PrepareContainerForItemOverride(element, item);
          }
      }
      

      感谢所有回复的人。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多