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)。
任何帮助将不胜感激。
您是否尝试过为节点创建视图模型?
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);
}
}
}
您可以使用以下ItemContainerTemplate
将TreeViewItem
绑定到视图模型:
<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>