微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言

如果对您有所帮助:欢迎赞赏

简化MVVM属性设置和修改 - .NET CORE(C#) WPF开发

阅读导航

  1. 常用类属性设置、获取方式
  2. 二次封装 INotifyPropertyChanged
  3. Demo 展示、源码下载

1. 常用类属性设置、获取方式

  1. public class Student : INotifyPropertyChanged
  2. {
  3. private string name;
  4. public string Name
  5. {
  6. get { return name; }
  7. set
  8. {
  9. if(name != value)
  10. {
  11. name = value;
  12. OnPropertyChanged("Name")
  13. }
  14. }
  15. }
  16. #region INotifyPropertyChanged
  17. public event PropertyChangedEventHandler PropertyChanged;
  18. public void OnPropertyChanged(string propertyName)
  19. {
  20. if (PropertyChanged != null)
  21. {
  22. PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  23. }
  24. }
  25. #endregion
  26. }

这种方式总感觉有点啰嗦,如果 Name 属性名修改,字符串 "Name" 还要手动修改,就算 Ctrl+H 替换也容易出错,如果使用下面这种方式,是不是感觉更清爽一点?

  1. public class Student : PropertyNotifyObject
  2. {
  3. public string Name
  4. {
  5. get { return this.GetValue(cu => cu.Name); }
  6. set { this.SetValue(cu => cu.Name, value); }
  7. }
  8. }

2. 二次封装INotifyPropertyChanged

封装的基类PropertyNotifyObject出处我忘了,15年网上找的,源码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Linq.Expressions;
  5. using System.Windows;
  6. using System.Windows.Threading;
  7. namespace MVVMTest
  8. {
  9. #region 封装WPF属性
  10. public class MyCommMetoh
  11. {
  12. //得到属性的名称
  13. public static string GetPropertyName<T, U>(Expression<Func<T, U>> exp)
  14. {
  15. string _pName = "";
  16. if (exp.Body is MemberExpression)
  17. {
  18. _pName = (exp.Body as MemberExpression).Member.Name;
  19. }
  20. else if (exp.Body is UnaryExpression)
  21. {
  22. _pName = ((exp.Body as UnaryExpression).Operand as MemberExpression).Member.Name;
  23. }
  24. return _pName;
  25. }
  26. }
  27. public class NotifyPropertyBase : INotifyPropertyChanged
  28. {
  29. /// <summary>
  30. /// Returns a dispatcher for multi-threaded scenarios
  31. /// </summary>
  32. /// <returns></returns>
  33. public static Dispatcher GetDispatcher(DispatcherObject source = null)
  34. {
  35. //use the application's dispatcher by default
  36. if (Application.Current != null) return Application.Current.Dispatcher;
  37. //fallback for WinForms environments
  38. if (source != null && source.Dispatcher != null) return source.Dispatcher;
  39. //ultimatively use the thread's dispatcher
  40. return Dispatcher.CurrentDispatcher;
  41. }
  42. #region INotifyPropertyChanged
  43. public void OnPropertyChanged(string propertyName)
  44. {
  45. if (PropertyChanged != null)
  46. {
  47. GetDispatcher().BeginInvoke((Action)delegate
  48. {
  49. try
  50. {
  51. PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  52. }
  53. catch (Exception ex)
  54. {
  55. var msg = string.Format("发送UI属性变化事件异常,属性名称: {0}, 异常详细信息: {1}", propertyName, ex.ToString());
  56. }
  57. }
  58. );
  59. }
  60. }
  61. public void OnPropertyChanged<T>(Expression<Func<T>> expression)
  62. {
  63. if (PropertyChanged != null)
  64. {
  65. var propertyName = ((MemberExpression)expression.Body).Member.Name;
  66. PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  67. }
  68. }
  69. public event PropertyChangedEventHandler PropertyChanged;
  70. #endregion
  71. }
  72. public static class NotifyPropertyBaseEx
  73. {
  74. public static void OnPropertyChanged<T, U>(this T npb, Expression<Func<T, U>> exp) where T : NotifyPropertyBase, new()
  75. {
  76. string _PropertyName = MyCommMetoh.GetPropertyName(exp);
  77. npb.OnPropertyChanged(_PropertyName);
  78. }
  79. }
  80. public class PropertyNotifyObject : NotifyPropertyBase, IDisposable
  81. {
  82. public PropertyNotifyObject()
  83. {
  84. }
  85. Dictionary<object, object> _ValueDictionary = new Dictionary<object, object>();
  86. #region 根据属性名得到属性值
  87. public T GetPropertyValue<T>(string propertyName)
  88. {
  89. if (string.IsNullOrEmpty(propertyName)) throw new ArgumentException("invalid " + propertyName);
  90. object _propertyValue;
  91. if (!_ValueDictionary.TryGetValue(propertyName, out _propertyValue))
  92. {
  93. _propertyValue = default(T);
  94. _ValueDictionary.Add(propertyName, _propertyValue);
  95. }
  96. return (T)_propertyValue;
  97. }
  98. #endregion
  99. public void SetPropertyValue<T>(string propertyName, T value)
  100. {
  101. if (!_ValueDictionary.ContainsKey(propertyName) || _ValueDictionary[propertyName] != (object)value)
  102. {
  103. _ValueDictionary[propertyName] = value;
  104. OnPropertyChanged(propertyName);
  105. }
  106. }
  107. #region Dispose
  108. public void Dispose()
  109. {
  110. DoDispose();
  111. }
  112. ~PropertyNotifyObject()
  113. {
  114. DoDispose();
  115. }
  116. void DoDispose()
  117. {
  118. if (_ValueDictionary != null)
  119. _ValueDictionary.Clear();
  120. }
  121. #endregion
  122. }
  123. public static class PropertyNotifyObjectEx
  124. {
  125. public static U GetValue<T, U>(this T t, Expression<Func<T, U>> exp) where T : PropertyNotifyObject
  126. {
  127. string _pN = MyCommMetoh.GetPropertyName(exp);
  128. return t.GetPropertyValue<U>(_pN);
  129. }
  130. public static void SetValue<T, U>(this T t, Expression<Func<T, U>> exp, U value) where T : PropertyNotifyObject
  131. {
  132. string _pN = MyCommMetoh.GetPropertyName(exp);
  133. t.SetPropertyValue<U>(_pN, value);
  134. }
  135. }
  136. #endregion
  137. }

3. Demo展示、源码下载

源码下载:MVVMTest

展示效果:

除非注明,文章均由 Dotnet9 整理发布,欢迎转载。


转载请注明本文地址:https://dotnet9.com/8572.html


欢迎扫描下方二维码关注 Dotnet9 的微信公众号,本站会及时推送最新技术文章



时间如流水,只能流去不流回!

这段时间在家,除了睡觉,也不要忘了学习。

简化MVVM属性设置和修改 - .NET CORE(C#) WPF开发的更多相关文章

  1. Prism+MaterialDesign+EntityFramework Core+Postgresql WPF开发总结 之 基础篇

    本着每天记录一点成长一点的原则,打算将目前完成的一个WPF项目相关的技术分享出来,供团队学习与总结. 总共分三个部分: 基础篇主要争对C#初学者,巩固C#常用知识点: 中级篇主要争对WPF布局与美化, ...

  2. 简易音乐播放器主界面设计 - .NET CORE(C#) WPF开发

    微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. 简易音乐播放器主界面设计 - .NET CORE(C#) WPF开发 阅读导航 本文背景 代码 ...

  3. Prism+MaterialDesign+EntityFramework Core+Postgresql WPF开发总结 之 中级篇

    本着每天记录一点成长一点的原则,打算将目前完成的一个WPF项目相关的技术分享出来,供团队学习与总结. 总共分三个部分: 基础篇主要争对C#初学者,巩固C#常用知识点: 中级篇主要争对WPF布局与Mat ...

  4. 少量代码设计一个登录界面 - .NET CORE(C#) WPF开发

    微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. 少量代码设计一个登录界面 - .NET CORE(C#) WPF开发 阅读导航 本文背景 代码 ...

  5. .net core 和 WPF 开发升讯威在线客服与营销系统:背景和产品介绍

    本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 在线演示环境:https://kf-m.shengxunwei.com ...

  6. .net core 和 WPF 开发升讯威在线客服与营销系统:使用 WebSocket 实现访客端通信

    本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 在线演示环境:https://kf.shengxunwei.com 注意 ...

  7. .net core 和 WPF 开发升讯威在线客服与营销系统:使用 TCP协议 实现稳定的客服端

    本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 在线演示环境:https://kf.shengxunwei.com 注意 ...

  8. .net core 和 WPF 开发升讯威在线客服系统:怎样实现拔网线也不丢消息的高可靠通信(附视频)

    本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 在线演示环境:https://kf.shengxunwei.com 注意 ...

  9. .net core 和 WPF 开发升讯威在线客服与营销系统:系统总体架构

    本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 在线演示环境:https://kf.shengxunwei.com 注意 ...

随机推荐

  1. Dart语言学习(六) Dart 列表List数组

    创建List : var list = [1,2,3,"Dart",true]; 创建不可变List : var list = const [1,2,3,"Dart&qu ...

  2. 异想家Win10系统安装的软件与配置

    1.C盘推荐一个硬盘,256G,安装好驱动,显卡配置好高性能,激活Win10,屏蔽WIn10驱动更新(Show or hide updates.diagcab),改电脑名称为Sandeepin-PC. ...

  3. Thumb.db看不到的问题

    今天读取数据集的时候总是会读到一个Thumb.db的缩略图文件,点开查看选项里面的显示隐藏文件.文件夹处于勾选状态,此时文件夹中并不存在此文件. 解决方案: 勾选掉隐藏受保护的操作系统文件即可.

  4. RoBERTa模型总结

    RoBERTa模型总结 前言 ​ RoBERTa是在论文<RoBERTa: A Robustly Optimized BERT Pretraining Approach>中被提出的.此方法 ...

  5. mysql 基本常用语句

    1.展示当前数据库 所有表名(前提必须进入数据库,进入数据库语句:[use 数据库名;])mysql> show create table 表名; 2.看mysql支持哪些存储引擎:mysql& ...

  6. 从App.config中读取数据库连接字符串

    1.首先在App.config文件中添加如下代码注意<connectionStrings>插入位置. <connectionStrings> <add name=&quo ...

  7. Win10系统下如何将中文登录名改为英文登录名

    需求:本人每次在换完系统后是默认,图方便,登录名就直接是自己的名字,造成以后安装个别软件时会莫名其妙的出错. 解决办法: 1.在当前用户开始处-点击右键(Windows键+X)-注销 2.切换到Adm ...

  8. 安卓开发实战-记账本APP(四)

    今天实现的内容有:添加账本信息,个人头像的切换,密码的修改,退出登录. 添加账本信息有三个功能: ①记一笔支出项目 ②记一笔收入项目 ③清空所有项目 在此期间遇到的困难有:Activity与Fragm ...

  9. 《快乐编程大本营》java语言训练班 2课:java的变量

    <快乐编程大本营>java语言训练班 2课:java的变量 1变量介绍 2变量分类,数值变量 3变量分类-字符串变量 4变量分类-布尔变量 5变量分类-对象 http://code6g.c ...

  10. GitHub注册与Git安装

    注册GitHub GitHub官网 ☞☞☞☞[戳我] 一.打开,如下图所示, 按照要求进行注册. 安装Git Git官网下载☞☞☞☞ [戳我] 一.打开,根据自己的电脑系统选择不同的版本,这里主要是以 ...