什么是MVVM模式?

MVVM是Model-View-ViewModel的简写,Model就是模型,View就是视图,ViewModel就是View和Model之间解耦和传递消息的中间层。MVVM采用双向数据绑定,View中数据变化将自动反映到ViewModel上,反之,Model中数据变化也将会自动展示在View上。通过MVVM模式使得View和Model上的修改相互不影响,方便程序分工,测试和维护。

基于WPF的MVVM模式的框架有很多种,流行的是MvvmLight(轻量级Mvvm框架,现已不更新)和Prism(大型Mvvm框架),本篇不使用框架来实现MVVM模式构建项目,了解WPF内部实现机理。使用MVVM框架请参考:

MvvmLight:WPF MVVMLight介绍和使用(1)_无熵~的博客-CSDN博客

Prism:WPF Prism介绍和简单实例_prism.wpf_无熵~的博客-CSDN博客

创建一个基于MVVM模式的登录项目,实现方式:
首先建立相应的文件夹:一个ViewModel,一个View,一个Model。在ViewModel里面有一个基础的通知类:NotifyPropertyChanged,这个类继承自INotifyPropertyChanged(这个类是通知的基础类,当事件执行时,会将相应的值显示在绑定的控件上);一个命令通知类:DelegateCommand,实现ICommand接口,用于消息传递。

Model类:如果想让属性绑定到其他数据,可以将属性定义成依赖属性并让类继承DependencyObject类。

    public class User:DependencyObject    {        public string Name        {            get { return (string)GetValue(NameProperty); }            set { SetValue(NameProperty, value); }        }        // Using a DependencyProperty as the backing store for Name.  This enables animation, styling, binding, etc...        public static readonly DependencyProperty NameProperty =            DependencyProperty.Register("Name", typeof(string), typeof(User), new PropertyMetadata(null));        public string Password        {            get { return (string)GetValue(PasswordProperty); }            set { SetValue(PasswordProperty, value); }        }        public static readonly DependencyProperty PasswordProperty =            DependencyProperty.Register("Password", typeof(string), typeof(User), new PropertyMetadata(null));    }

View页面实现:

                                                                                

View页面指定数据源:

    ///     /// LoginWindow.xaml 的交互逻辑    ///     public partial class LoginWindow : Window    {        public LoginWindow()        {            InitializeComponent();            this.DataContext = new UserVM();        }    }

ViewModel类:

    public class UserVM: NotifyPropertyChanged    {        private string info;        public string Info        {            get { return info; }            set            {                info = value;                OnPropertyChanged();            }        }        public UserVM()        {            User = new User()            {                Name = "admin",                Password = "123456"            };            Info = "用户登录";        }        private User user;        public User User        {            get { return user; }            set            {                user = value;                OnPropertyChanged();                //NotifyPropertyChanged("User");            }        }        public ICommand LoginCommand        {            get { return new DelegateCommand(LoginCommandEvent, CanLogin); }        }        private void LoginCommandEvent(Object o)        {            MessageBox.Show(string.Format($"用户:{User.Name},参数:{o.ToString()}"));        }        private bool CanLogin(Object o)        {            if(o!=null)            {                return true;            }            return false;        }    }

ViewModel中NotifyPropertyChanged类定义,继承自INotifyPropertyChanged。

 public class NotifyPropertyChanged : INotifyPropertyChanged    {        ///

/// 实现接口 ///

public event PropertyChangedEventHandler PropertyChanged; ///

/// 属性变更事件 ///

/// 事件源 public void OnPropertyChanged([CallerMemberName] string propertyName = "") { this.PropertyChanged" />https://download.csdn.net/download/lvxingzhe3/87669239