WPF中MVVM自动更新

闪电
闪电
闪电
57
文章
0
评论
2020年4月27日14:51:55 评论 61

CleanAOP介绍:https://github.com/Jarvin-Guan/CleanAOP

前言

讲起WPF,开发模式MVVM是必不可少的,使用MVVM模式以后可以在View中写界面,需要使用到的数据则使用绑定的方式写到标签中,那么控制权就放到了ViewModel中,那么有一个需求是每一个使用MVVM者都会有的,就是在后台改变ViewModel的属性时,同时使前台View绑定的标签内容得到相应更新变动。
定义属性方式对比

传统方式

private string m_Name = "";
public string Name
{
    set
    { 
        if(value!=m_Name){
            m_Name = value; 
            OnPropertyChanged( "Name" ); 
        }
    }
    get { return m_Name; }
}

使用CleanAOP后

public virtual string Name { set; get; }

对比总结:使用传统方式使用了一大堆累赘的代码,使用CleanAOP后,简单、方便。

实战(使用CleanAOP使属性自动更新)

  1. 下载CleanAOP2.0.0,并且引用dll到项目中。

  2. Notice更新类:

    public class Notice : INotifyPropertyChanged, ICommand
    {
        public event PropertyChangedEventHandler PropertyChanged;
    
        public void OnPropertyChanged(string name)
        {
            if (PropertyChanged != null)
            {
                this.PropertyChanged(this, new  PropertyChangedEventArgs(name));
            }
    
        } 
    
        public bool CanExecute(object parameter)
        {
            if (this.CanExecuteFunc != null)
            {
                return this.CanExecuteFunc(parameter);
            }
            return true;  
        }
        public event EventHandler CanExecuteChanged;
    
        public void Execute(object parameter)
        {
            if (this.ExecuteAction != null)
            {
                this.ExecuteAction(parameter);
            }
        }
    
        public Func<object, bool> CanExecuteFunc { set; get; }
    
        public Action<object> ExecuteAction { set; get; }
    
        }
  3. 定义ViewModel:

    [PropertyNotifyIntercept]//添加属性通知标签,表示该类接入属性通知拦截器。
    //继承Notice
    public class MainWindowVM : Notice
    {
      //定义Name属性
      public virtual string Name { set; get; } = "jarvin";
    }
  4. 界面上绑定该属性

    <TextBox Text="{Binding Name}"></TextBox>
  5. 设置DataContext

    public MainWindow()
    {
      InitializeComponent();
      this.DataContext = InterceptClassFactory.GetInterceptClass<MainWindowVM>();
    }
  6. 修改MainWindowVM的Name的值,这时候界面上会自动做出更新!!

总结

感谢大家使用CleanAOP,使用该方式也可以绑定命令,绑定命令的方式在Demo中会有展示,希望能给大家带来方便。大家可以下载Demo来调试。

继续阅读
weinxin
我的微信
微信扫一扫
闪电
  • 本文由 发表于 2020年4月27日14:51:55
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
WPF如何用TreeView制作好友列表、播放列表 .NET

WPF如何用TreeView制作好友列表、播放列表

前言   TreeView这个控件对于我来说是用得比较多的,以前做的小聊天软件(好友列表)、音乐播放器(播放列表)、类库展示器(树形类结构)等都用的是TreeView,下面以一个好友列表为例,说明一下...
WPF多线程UI更新——两种方法 .NET

WPF多线程UI更新——两种方法

前言     在WPF中,在使用多线程在后台进行计算限制的异步操作的时候,如果在后台线程中对UI进行了修改,则会出现一个错误:(调用线程无法访问此对象,因为另一个线程拥有该对象。)这是很常见的一个错误...
WPF 蒙罩层 LoadingPage .NET

WPF 蒙罩层 LoadingPage

前言   无论是在PC客户端,移动端,网站,在遇到长时间处理的时候都会需要用到蒙罩层,让用户有更好的体现。今天上网逛了一下各位前辈网友的蒙罩层的实现方式,觉得有很多都搞复杂了(利用前台代码+后台代码+...
.NET 压缩解压库发布,支持进度查看 .NET

.NET 压缩解压库发布,支持进度查看

发布了一个 .net压缩解压库,基于SharpZipLib开发 ,支持进度查看,支持路径保持与否。 () 是一个基于SharpZipLib的一个压缩和解压的类库,提供给用户在.net环境下使用(VB....
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: