WPF TreeView 检测SelectedItem变化的简单方案

这篇具有很好参考价值的文章主要介绍了WPF TreeView 检测SelectedItem变化的简单方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

TreeView无法绑定SelectedItem,而又想知道treeview的selecteditem的变化,当然目前有很多方法,我这里简单的提供一个。

目前主要思路就是通过处理xaml的TreeViewItem的IsSelected属性来进行绑定。

  <TreeView
            BorderThickness="0"
            Width="220"
            ItemsSource="{Binding Items, IsAsync=True}"
            HorizontalAlignment="Left">
            <TreeView.ItemContainerStyle>
                <Style TargetType="{x:Type TreeViewItem}">
                    <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
                    <Setter Property="FontWeight" Value="Normal" />
                    <Setter Property="HorizontalAlignment" Value="Left" />
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="FontWeight" Value="Bold" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </TreeView.ItemContainerStyle>
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Items, IsAsync=True}">
                    <Label Content="{Binding Name}" />
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>

主要部分是

   <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />

这里的意思就是绑定到集合泛型的IsSelected属性。

这里呢主要是通过抽象类去实现的也就是:

 public abstract class TreeViewItemModel<T> : Notify
    {

        private bool _IsSelected;

        public bool IsSelected
        {
            get { return _IsSelected; }
            set
            {
                _IsSelected = value;
                OnChanged();
                if (value)
                {
                    IChanged<T> changed = ModelChangedManger.Sub.Get<T>();
                    if (changed?.Accepted == true)
                    {
                        changed.OnModelChanged((T)Convert.ChangeType(this, typeof(T)));
                    }
                }

            }
        }
    }

具体的使用类再去继承即可,也就是

public class GroupModel : TreeViewItemModel<GroupModel>
    {
        public GroupModel()
        {
            Id = Guid.NewGuid();
        }
        private Guid _id;

        public Guid Id
        {
            get { return _id; }
            set
            {
                _id = value;
                OnChanged();
            }
        }
        private string _name;

        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                OnChanged();
            }
        }
        private ObservableCollection<GroupModel> _Item = new ObservableCollection<GroupModel>();
        public ObservableCollection<GroupModel> Items
        {
            get { return _Item; }
            set
            {
                _Item = value;
                OnChanged();
            }
        }

    }

处理完这样,我们只是完成了一部分。这里这来说下

          if (value)
                {
                    IChanged<T> changed = ModelChangedManger.Sub.Get<T>();
                    if (changed?.Accepted == true)
                    {
                        changed.OnModelChanged((T)Convert.ChangeType(this, typeof(T)));
                    }
                }

这个是干什么的。

很明显,Isslected属性触发,我们想通知viewmodel,treeview的selecteditem属性变了,或者叫做selectindex也变了的意思。所以简单的实现了一个事件聚合器,这个部分代码比较简单,整体如下

    public interface IChanged<T>
    {
        void OnModelChanged(T Model);
        bool Accepted { get; set; }
    }

    public sealed class ModelChangedManger
    {
        private ModelChangedManger()
        {

        }
        static ModelChangedManger() { }
        private class Inner
        {
            private Inner() { }
            internal readonly static ModelChangedManger manger = new ModelChangedManger();
        }
        private ConcurrentDictionary<Type, object> Keys { get; set; } = new ConcurrentDictionary<Type, object>();
        public IChanged<T> Get<T>()
        {
            if (Keys.TryGetValue(typeof(T), out object val))
            {
                return val as IChanged<T>;
            }
            return null;
        }
        public void Set<T>(IChanged<T> model)
        {
            if (!Keys.ContainsKey(typeof(T)))
            {
                Keys.TryAdd(typeof(T), model);
            }
        }
        public void Remove<T>()
        {
            Keys.TryRemove(typeof(T), out _);
        }
        public static ModelChangedManger Sub
        {
            get => Inner.manger;
        }
    }

主要是Ichanged接口和manger的一起搭配使用。使用字典将要引发和被引发的类型,类存储起来,这样就可以全局或者大范围的使用了。

同理 我们需要viewmodel上继承一个引发事件的ichanged类

  public abstract class TreeViewModel<T> : Notify, IChanged<T>
    {
        public virtual void OnModelChanged(T Model)
        {
            SelectedItem = Model;
        }

        private bool _Accepted;

        public bool Accepted
        {
            get { return _Accepted; }
            set
            {
                _Accepted = value;
                OnChanged();
            }
        }

        private T _SelectedItem;

        public T SelectedItem
        {
            get { return _SelectedItem; }
            set
            {
                _SelectedItem = value;
                OnChanged();
            }
        }
    }

    public class ViewModel : TreeViewModel<GroupModel>
    {
        private System.Collections.ObjectModel.ObservableCollection<GroupModel> _list = new System.Collections.ObjectModel.ObservableCollection<GroupModel>();

        public System.Collections.ObjectModel.ObservableCollection<GroupModel> Items
        {
            get { return _list; }
            set
            {
                _list = value;
                OnChanged();
            }
        }
        public ViewModel()
        {
            GroupModel groupModel1 = new GroupModel();
            groupModel1.Name = "Ken";

            GroupModel groupModel_1 = new GroupModel();
            groupModel_1.Name = "A";
            GroupModel groupModel_2 = new GroupModel();
            groupModel_2.Name = "B";
            GroupModel groupModel_3 = new GroupModel();
            groupModel_3.Name = "C";
            GroupModel groupModel_4 = new GroupModel();
            groupModel_4.Name = "D";

            groupModel1.Items.Add(groupModel_1);
            groupModel1.Items.Add(groupModel_2);
            groupModel1.Items.Add(groupModel_3);
            groupModel1.Items.Add(groupModel_4);


            GroupModel groupModel2 = new GroupModel();
            groupModel2.Name = "TOM";

            GroupModel groupModel_5 = new GroupModel();
            groupModel_5.Name = "a";
            GroupModel groupModel_6 = new GroupModel();
            groupModel_6.Name = "b";
            GroupModel groupModel_7 = new GroupModel();
            groupModel_7.Name = "c";
            GroupModel groupModel_8 = new GroupModel();
            groupModel_8.Name = "d";

            groupModel2.Items.Add(groupModel_5);
            groupModel2.Items.Add(groupModel_6);
            groupModel2.Items.Add(groupModel_7);
            groupModel2.Items.Add(groupModel_8);

            Items.Add(groupModel1);
            Items.Add(groupModel2);
            ModelChangedManger.Sub.Set(this);
            this.Accepted = true;
        }
    }

这样,就可以简单的实现了对selectedItem的变化的监控了

源代码连接文章来源地址https://www.toymoban.com/news/detail-558582.html

到了这里,关于WPF TreeView 检测SelectedItem变化的简单方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • WPF绑定数据,增删改后实时更新TreeView/ListView

    WPF的界面的确好看,也引入了很多新功能,和winform相比更先进更强大......那么狗儿蛋,代价是什么? 代价就是WPF学起来比较费力。 数据绑定是WPF的特色之一,可以省去写代码更新UI界面的工作。这次打算做一个管理数据的小软件,自然的我也打算在界面上弄个TreeView,然后把

    2024年02月09日
    浏览(42)
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(5) -- 树列表TreeView的使用

    在我们展示一些参考信息的时候,有所会用树形列表来展示结构信息,如对于有父子关系的多层级部门机构,以及一些常用如字典大类节点,也都可以利用树形列表的方式进行展示,本篇随笔介绍基于WPF的方式,使用TreeView来洗实现结构信息的展示,以及对它的菜单进行的设

    2024年02月08日
    浏览(33)
  • wpf RadioButton自定义样式 圆角/直角变化 背景色渐变

    样式部分 xam  根据  CommandParameter 的value不同,背景圆角的方向不同 效果如    

    2024年02月16日
    浏览(28)
  • WPF绑定单变量Binding和绑定多变量MultiBinding 字符串格式化 UI绑定数据,数据变化自动更新UI,UI变化自动更新数据

    UI绑定数据,数据变化自动更新UI,UI变化自动更新数据。 支持多设备,同时下载。 在WPF (Windows Presentation Foundation) 中,您可以使用数据绑定来将变量绑定到界面元素。这允许您在界面上显示变量的值,并使这些值能够自动更新,而不需要手动更新界面。以下是如何绑定变量到

    2024年02月07日
    浏览(29)
  • 【信号变化检测】使用新颖的短时间条件局部峰值速率特征进行信号变化/事件/异常检测(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码及文献 文献来

    2024年02月07日
    浏览(45)
  • 图像配准(匹配)与变化检测

    变化检测的基本框架 基于神经网络的变化检测特征抽取 变化检测的粒度 场景级的变化检测(SLCD) 然而,像素级或物体级的变化检测方法不适用于土地利用变化分析。造成这种情况的主要原因可能是,场景中的物体,如植被生长和个别建筑的拆除/建造,不会直接影响土地使

    2023年04月23日
    浏览(85)
  • 【OpenCv • c++】几何检测 —— 霍夫变换 | 霍夫直线检测 | 霍夫线变化

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪

    2024年02月06日
    浏览(28)
  • 使用 KeyValueDiffers 检测Angular 对象的变化

    ngDoCheck 是 Angular 生命周期钩子之一。它允许组件在 Angular 检测到变化时执行自定义的变化检测逻辑。 当任何组件或指令的输入属性发生变化、在组件内部发生了变更检测周期或者当主动触发变更检测策略(例如通过 ChangeDetectorRef.detectChanges() 方法)时,Angular 会调用 ngDoChec

    2024年02月10日
    浏览(24)
  • Github复现-测试基于transformer的变化检测模型BIT_CD

    源码链接:  GitHub - justchenhao/BIT_CD: Official Pytorch Implementation of \\\"Remote Sensing Image Change Detection with Transformers\\\" Official Pytorch Implementation of \\\"Remote Sensing Image Change Detection with Transformers\\\" - GitHub - justchenhao/BIT_CD: Official Pytorch Implementation of \\\"Remote Sensing Image Change Detection with Transformers\\\" htt

    2024年02月02日
    浏览(25)
  • BIT 变化检测模型复现 深度学习学习笔记 基于transformer结构的图像处理模型

    BIT 是用 transformer 结构进行变化检测的一个孪生网络,它的 backbone 用的是 Resnet 结构,具体结构分析可以参考这个链接的作者写的,非常清楚, http://t.csdn.cn/rA9sH。 下面就是来讲我自己的实现过程,比较简单。 首先,在官网找到相应的代码,下载解压到自己的本地。github上面的

    2024年02月10日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包