【问题标题】:How to call Focus on a TreeView from the ViewModel如何从 ViewModel 调用对 TreeView 的关注
【发布时间】: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&lt;T&gt; 一样),您将在TreeView 中看到新项目。
  • @Dennis IsExpanded 绑定到相应的属性,我在添加新项目之前将其设置为true,并且集合是ObservableCollection,但父项目仍然没有展开。

标签: c# wpf mvvm treeview


【解决方案1】:

在资源中添加如下样式

<Style TargetType="{x:Type TreeViewItem}">
    <Setter Property="FocusManager.FocusedElement"
            Value="{Binding RelativeSource={RelativeSource Self}}" />
</Style>

这将使每个新的 TreeViewItem 在创建时都能聚焦自己

试试看这是不是你要找的东西

【讨论】:

  • 我已经尝试添加您建议的样式,但是当将新子项添加到父项TreeViewItem 并将其设置为选定项时,父项TreeViewItem 仍不会在TreeView 中扩展。我是否误解了一些东西?我尝试将Setter 添加到窗口资源样式和TreeView.ItemContainerStyle
  • @MickWaites,以上样式仅有助于专注于新添加的项目。为了扩展父项,您可以简单地通过绑定在父项上设置 IsExpanded 为 true。如果您可以分享一些代码如何存储树项并填充树视图,也许我可以尝试一下。
  • 我已在原始问题中添加了信息。这有帮助吗?
  • @MickWaites,似乎您需要在添加新项目后将父级的 IsExpanded 设置为 true。如果这没有帮助,您能否发布您的应用程序的工作示例?我可以看看。
  • 添加新孩子后,我正在设置父母的 IsExpanded。不幸的是,我无法发布该应用程序,公司规则禁止它。抱歉,如果这妨碍您进一步帮助我。
猜你喜欢
  • 2014-08-06
  • 2023-03-03
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多