【发布时间】:2014-12-10 07:54:48
【问题描述】:
我们在 MVVM C# WPF 应用程序中使用 TreeView 控件。
我已成功将展开/折叠所有功能添加到视图 - 遍历 TreeView 中的所有项目,设置 IsExpanded,然后在 TreeView 上调用 Focus 以刷新更改。
我还成功添加了功能,可以在单击 TreeView 中的空白区域时清除 TreeView 中当前选定的 Item。
我当前的任务和问题是在 TreeView 中自动选择任何新添加的项目。 TreeViewItems 的 IsSelected 和 IsExpanded 属性绑定到 ViewModel 中的匹配属性,只要父节点展开,就可以在 ViewModel 上设置 IsSelected。
我已尝试在父 ViewModel 上设置 IsExpanded,但据我所知,我需要在 TreeView 上调用 Focus 以强制它更新和扩展其树的表示。因为我在 ViewModel 中,所以在不破坏 MVVM 的情况下我没有连接到 TreeView。
我怎样才能做到这一点?
编辑:为 pushpraj 添加的源代码
树项目是这样存储的:
private ObservableCollection<NodeViewModel> _children = new ObservableCollection<NodeViewModel>();
public ObservableCollection<NodeViewModel> Children
{
get { return _children; }
set
{
_children = value;
OnPropertyChanged("Children", this);
}
}
我们根节点的 Children 属性绑定到 TreeView 的 ItemsSource 属性。子节点以编程方式添加到根节点的 Children 属性中并相互添加。
我正在使用的来源不是我自己的,而且我对 WPF 没有过多的经验,所以如果我给你提供了错误的信息,请原谅我。我还注意到,我们在来自 Gong Solutions 的 TreeView 中使用了一些拖放功能。这可能是我们问题的原因吗?在我们的 ViewModel 中将 IsExpanded 设置为 true 不会在树视图中展开条目。
【问题讨论】:
-
你不需要关注
TreeView,也不需要关注父TreeViewItem来强制TreeView更新。如果TreeViewItem.IsExpanded绑定到视图模型的相应属性,只需将此属性设置为true并将新项目添加到父视图模型的集合中。如果该集合实现了INotifyCollectionChanged(就像ObservableCollection<T>一样),您将在TreeView中看到新项目。 -
@Dennis
IsExpanded绑定到相应的属性,我在添加新项目之前将其设置为true,并且集合是ObservableCollection,但父项目仍然没有展开。