WPF 在添加到集合后立即迭代树视图

本文关键字:迭代 视图 添加 集合 WPF | 更新日期: 2023-09-27 18:34:08

我有一个树视图。如果相关,我使用 MVVM 和 Caliburn Micro。我希望在添加节点后选择清除前的选定节点。我将 DependencyProperty 添加到名为 TreeViewSelectedItemProperty 的树视图中,用于设置属性。请参阅代码(注意:我简化了更容易阅读的代码):

在视图中模型:

Nodes.Clear(); 
Nodes.Add(globalNode);
SelectedNode = node;

在 DependencyProperty 文件 (TreeViewSelectedItemChanged 方法) 中:

Collection<TreeViewItem> c=GetAllItemContainers(myTreeView);
foreach (var treeViewItem in c)
{
      if (treeViewItem.DataContext == beforeClearingSelectedNode)
      {
          treeViewItem.IsSelected = true;
          return;
      }
}

其中 GetAllItemContainers 定义如下:

private static Collection<TreeViewItem> GetAllItemContainers(ItemsControl itemsControl)
{
        Collection<TreeViewItem> allItems = new Collection<TreeViewItem>();
        for (int i = 0; i < itemsControl.Items.Count; i++)
        {
            // try to get the item Container  
            TreeViewItem childItemContainer =  itemsControl.ItemContainerGenerator.ContainerFromIndex(i) as TreeViewItem;
            // the item container maybe null if it is still not generated from the runtime  
            if (childItemContainer != null)
            {
                allItems.Add(childItemContainer);
                Collection<TreeViewItem> childItems = GetAllItemContainers(childItemContainer);
                foreach (TreeViewItem childItem in childItems)
                {
                    allItems.Add(childItem);
                }
            }
        }
        return allItems;
}

问题是,尽管树有 4 个节点,但集合 c 的大小为 1。我尝试使用 TreeView 的加载事件,但在调用时集合的大小也是 1。集合的大小仅在打开视图时正确 (4)(调用依赖属性方法 TreeViewSelectedItemChanged。 我调试了它,看到 c.Count() 是 4)。

任何帮助将不胜感激。

WPF 在添加到集合后立即迭代树视图

您是否尝试过为节点创建视图模型?

public class NodeViewModel : PropertyChangedBase
{
    private bool isSelected;
    public NodeViewModel(string displayName)
    {
        this.DisplayName = displayName;
        this.Children = new ObservableCollection<NodeViewModel>();
    }
    public ObservableCollection<NodeViewModel> Children { get; private set; }
    public string DisplayName { get; private set; }
    public bool IsSelected
    {
        get { return this.isSelected; }
        set
        {
            if (value.Equals(this.isSelected))
            {
                return;
            }
            this.isSelected = value;
            this.NotifyOfPropertyChange(() => this.IsSelected);
            Console.WriteLine(value);
        }
    }
}

您可以使用以下ItemContainerTemplateTreeViewItem绑定到视图模型:

<TreeView ItemsSource="{Binding Tree}">
    <TreeView.ItemContainerStyle>
        <Style TargetType="TreeViewItem">
            <Setter Property="IsSelected" Value="{Binding IsSelected}" />
        </Style>
    </TreeView.ItemContainerStyle>
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}">
            <TextBlock Text="{Binding DisplayName}" />
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>