gpt4 book ai didi

WPF MVVM TreeView SelectedItem

转载 作者:行者123 更新时间:2023-12-03 08:45:49 25 4
gpt4 key购买 nike

这不可能这么困难。 WPF 中的 TreeView 不允许您设置 SelectedItem,表示该属性为 ReadOnly。我有 TreeView 填充,甚至在它的数据绑定(bind)集合更改时更新。

我只需要知道选择了什么项目。我正在使用 MVVM,因此没有代码隐藏或变量来引用 TreeView 。 This is the only solution我发现了,但这是一个明显的 hack,它在 XAML 中创建另一个元素,该元素使用 ElementName 绑定(bind)将自己设置为 treeviews 选定项,然后您也必须绑定(bind)您的 Viewmodel。 Several其他 questions被问到这个问题,但没有给出其他可行的解决方案。

我看过this question ,但是使用给出的答案会给我编译错误,由于某种原因,我无法将对混合 sdk System.Windows.Interactivity 的引用添加到我的项目中。它说“未知错误 system.windows 尚未预加载”,我还没有想出如何解决这个问题。

对于奖励积分:Microsoft 为什么要将此元素的 SelectedItem 属性设为只读?

最佳答案

以 MVVM 可接受的方式解决此问题的一种非常不寻常但非常有效的方法如下:

  • 在 TreeView 所在的同一 View 上创建可见性折叠的 ContentControl。适当命名,并将其内容绑定(bind)到一些 SelectedSomething View 模型中的属性。此 ContentControl 将“持有”所选对象并处理它的绑定(bind) OneWayToSource;
  • 收听SelectedItemChanged在 TreeView 中,并在代码隐藏中添加一个处理程序以将您的 ContentControl.Content 设置为新选择的项目。

  • XAML:
    <ContentControl x:Name="SelectedItemHelper" Content="{Binding SelectedObject, Mode=OneWayToSource}" Visibility="Collapsed"/>
    <TreeView ItemsSource="{Binding SomeCollection}"
    SelectedItemChanged="TreeView_SelectedItemChanged">

    代码背后:
        private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
    SelectedItemHelper.Content = e.NewValue;
    }

    View 模型:
        public object SelectedObject  // Class is not actually "object"
    {
    get { return _selected_object; }
    set
    {
    _selected_object = value;
    RaisePropertyChanged(() => SelectedObject);
    Console.WriteLine(SelectedObject);
    }
    }
    object _selected_object;

    关于WPF MVVM TreeView SelectedItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7153813/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com