MVVM-命令模式的实现与应用

  • MVVM-命令模式的实现与应用已关闭评论
  • 81 次浏览
  • A+
所属分类:.NET技术
摘要

本文同时为b站WPF课程的笔记,相关示例代码这个其实前面已经讲过一部分使用{Binding}设置数据绑定,将控件的属性绑定到 ViewModel 的相应属性。


MVVM-命令模式的实现与应用

本文同时为b站WPF课程的笔记,相关示例代码

绑定

这个其实前面已经讲过一部分

使用{Binding}设置数据绑定,将控件的属性绑定到 ViewModel 的相应属性。

比如说需要注意,在xaml中绑定的不再是UserNamePassword了,而是loginModel.UserNameloginModel.Password

还要为命令和用户交互设置绑定,例如按钮点击事件可以绑定到 ViewModel 中的命令。

命令

在MVVM中,通常不会在 View 的代码后置文件(比如这里是MainWindow.xaml.cs)中编写逻辑代码,而是使用命令来处理用户交互,如按钮点击。

命令模式框架

首先我们新建一个类,在这个类中实现基本的命令模式框架。

新建类RelayCommand.cs,让这个类继承自ICommand,并且实现以下接口。照抄代码即可。

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Input;  namespace WPF_Study_LIBRARY {     public class RelayCommand:ICommand     {         /// <summary>         /// 命令是否能够执行         /// </summary>         readonly Func<bool> _canExecute;         /// <summary>         /// 命令需要执行的方法         /// </summary>         readonly Action _execute;          public RelayCommand(Action action,Func<bool> canExecute)         {             _canExecute = canExecute;             _execute = action;         }          public bool CanExecute(object parameter)         {             if (_canExecute == null)             {                 return true;             }             return _canExecute();         }           public void Execute(object parameter)         {             if (_execute == null)             {                 return;             }             _execute();         }         public event EventHandler CanExecuteChanged         {             add             {                 if (_canExecute != null)                 {                     CommandManager.RequerySuggested += value;                 }             }             remove             {                 if (_canExecute != null)                 {                     CommandManager.RequerySuggested -= value;                 }             }         }     } } 

这段代码定义了一个 RelayCommand 类,实现了 ICommand 接口,用于在WPF应用程序中执行命令。总而言之,照抄即可.

引入命令

在 ViewModel 中(我这里是LoginVM.cs)写入:

void LoginFunc() {     if (UserName == "xxx" && Password == "xxx")     {         //MessageBox.Show("Login");         Index index = new Index();         index.Show();         _main.Hide();     }     else     {         MessageBox.Show("Error");         UserName = "";         Password = "";     } }    bool CanLoginExecute() {     return true; }  public ICommand LoginAction {     get     {         return new RelayCommand(LoginFunc, CanLoginExecute);     } } 

void LoginFunc()就是一个简单的登录函数,简单的判断用户名与密嘛是否匹配。

bool CanLoginExecute()是用来确定是否可以执行登录操作,在我这个例子当中并没有做其他的阻拦。实际的运用中可以根据特定的条件来确定是否可以执行登录操作,比如检查用户名和密码是否符合要求、网络连接是否可用等。

public ICommand LoginAction是一个公共属性,可以被绑定到登录按钮等 UI 元素上。

按钮绑定命令

将需要绑定的元素的Command属性设定为{Binding LoginAction},这里的LoginAction就是上面的公共属性。

<Button Grid.Row="3" Grid.ColumnSpan="2" Content="Login" Command="{Binding LoginAction}"/> 

小结

在上述操作中,我们简单的尝试了MVVM模式,将逻辑与界面分离,以实现更好的可维护性和可测试性。

刚刚呢,我是将登录的功能的具体实现代码放到了ViewModel中的LoginFunc()函数中,而不是放在MainWindow.xaml.cs等View相关的代码后置文件中。同时使用了命令模式来处理交互,确保了逻辑与界面的分离。

经过这一次的MVVM - 命令模式的实现与运用与上一次的MVVM - Model和ViewModel的创建和配置,基本描述完了实现 MVVM 的完整步骤。

需要的全部代码可以在相关示例代码WPF_Study_LIBRARY项目中查看。