我们在 MVVM C# WPF 应用程序中使用 TreeView 控件。
我已成功向 View 添加“全部展开/折叠”功能 - 迭代 TreeView 中的所有项目,设置 IsExpanded,然后在 TreeView 上调用 Focus 来刷新更改。
我还成功添加了在单击 TreeView 中的空白区域时清除 TreeView 中当前选定的项目的功能。
我当前的任务和问题是自动选择 TreeView 中任何新添加的项目。 TreeViewItems 的 IsSelected 和 IsExpanded 属性绑定(bind)到 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 属性绑定(bind)到 TreeView 的 ItemsSource 属性。子节点以编程方式添加到根节点的 Children 属性以及彼此之间。
我使用的来源不是我自己的,而且我对 WPF 没有太多经验,因此如果我向您提供了错误的信息,请原谅我。我还注意到,我们在Gong Solutions 的TreeView 中使用了一些拖/放功能。这可能是我们问题的原因吗?在 ViewModel 中将 IsExpanded 设置为 true 不会伸展树(Splay Tree) View 中的条目。
最佳答案
在资源中添加以下样式
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="FocusManager.FocusedElement"
Value="{Binding RelativeSource={RelativeSource Self}}" />
</Style>
这将使每个新的 TreeViewItem 在创建时能够自行聚焦
尝试一下,看看这是否是您想要的
关于c# - 如何从 ViewModel 调用 TreeView 上的焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26379153/