c# - 如何从 ViewModel 调用 TreeView 上的焦点

标签 c# wpf mvvm treeview

我们在 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/

相关文章:

c# - 在 XAML 中从 DependecyProperty 绑定(bind)到 DataContext (ViewModel)

c# - UIA InvokePattern.Invoke() 在系统被锁定时抛出异常。 (在 .NET 4.5.2 中)

c# - 解析我专有的字符串格式

c# - 使用 WPF 中的事件支持为游戏创建棋盘

c# - 我应该如何使用 MVVM 模式在 Wpf 应用程序上实现本地化?

wpf - 实现诸如MVC或MVVM的架构模式是否为时已晚?

c# - 非得用C#dll调用C++dll?

c# - 带有类库的 Nlog

c# - 在 Datagrid-WPF 中垂直显示水平表格

c# - INotifyPropertyChanged 和计算属性