翼度科技»论坛 编程开发 .net 查看内容

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

5

主题

5

帖子

15

积分

新手上路

Rank: 1

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

本文同时为b站的笔记,相关示例代码
绑定

这个其实前面已经讲过一部分
使用{Binding}设置数据绑定,将控件的属性绑定到 ViewModel 的相应属性。
比如说需要注意,在xaml中绑定的不再是UserName和Password了,而是loginModel.UserName和loginModel.Password。
还要为命令和用户交互设置绑定,例如按钮点击事件可以绑定到 ViewModel 中的命令。
命令

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

首先我们新建一个类,在这个类中实现基本的命令模式框架。
新建类RelayCommand.cs,让这个类继承自ICommand,并且实现以下接口。照抄代码即可。
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Windows.Input;
  7. namespace WPF_Study_LIBRARY
  8. {
  9.     public class RelayCommand:ICommand
  10.     {
  11.         /// <summary>
  12.         /// 命令是否能够执行
  13.         /// </summary>
  14.         readonly Func<bool> _canExecute;
  15.         /// <summary>
  16.         /// 命令需要执行的方法
  17.         /// </summary>
  18.         readonly Action _execute;
  19.         public RelayCommand(Action action,Func<bool> canExecute)
  20.         {
  21.             _canExecute = canExecute;
  22.             _execute = action;
  23.         }
  24.         public bool CanExecute(object parameter)
  25.         {
  26.             if (_canExecute == null)
  27.             {
  28.                 return true;
  29.             }
  30.             return _canExecute();
  31.         }
  32.         public void Execute(object parameter)
  33.         {
  34.             if (_execute == null)
  35.             {
  36.                 return;
  37.             }
  38.             _execute();
  39.         }
  40.         public event EventHandler CanExecuteChanged
  41.         {
  42.             add
  43.             {
  44.                 if (_canExecute != null)
  45.                 {
  46.                     CommandManager.RequerySuggested += value;
  47.                 }
  48.             }
  49.             remove
  50.             {
  51.                 if (_canExecute != null)
  52.                 {
  53.                     CommandManager.RequerySuggested -= value;
  54.                 }
  55.             }
  56.         }
  57.     }
  58. }
复制代码
这段代码定义了一个 RelayCommand 类,实现了 ICommand 接口,用于在WPF应用程序中执行命令。总而言之,照抄即可.
引入命令

在 ViewModel 中(我这里是LoginVM.cs)写入:
  1. void LoginFunc()
  2. {
  3.     if (UserName == "xxx" && Password == "xxx")
  4.     {
  5.         //MessageBox.Show("Login");
  6.         Index index = new Index();
  7.         index.Show();
  8.         _main.Hide();
  9.     }
  10.     else
  11.     {
  12.         MessageBox.Show("Error");
  13.         UserName = "";
  14.         Password = "";
  15.     }
  16. }
  17. bool CanLoginExecute()
  18. {
  19.     return true;
  20. }
  21. public ICommand LoginAction
  22. {
  23.     get
  24.     {
  25.         return new RelayCommand(LoginFunc, CanLoginExecute);
  26.     }
  27. }
复制代码
void LoginFunc()就是一个简单的登录函数,简单的判断用户名与密嘛是否匹配。
bool CanLoginExecute()是用来确定是否可以执行登录操作,在我这个例子当中并没有做其他的阻拦。实际的运用中可以根据特定的条件来确定是否可以执行登录操作,比如检查用户名和密码是否符合要求、网络连接是否可用等。
public ICommand LoginAction是一个公共属性,可以被绑定到登录按钮等 UI 元素上。
按钮绑定命令

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

在上述操作中,我们简单的尝试了MVVM模式,将逻辑与界面分离,以实现更好的可维护性和可测试性。
刚刚呢,我是将登录的功能的具体实现代码放到了ViewModel中的LoginFunc()函数中,而不是放在MainWindow.xaml.cs等View相关的代码后置文件中。同时使用了命令模式来处理交互,确保了逻辑与界面的分离。
经过这一次的MVVM - 命令模式的实现与运用与上一次的MVVM - Model和ViewModel的创建和配置,基本描述完了实现 MVVM 的完整步骤。
需要的全部代码可以在相关示例代码中WPF_Study_LIBRARY项目中查看。

来源:https://www.cnblogs.com/Vanilla-chan/p/18003390/MVVM-Command
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具