MVVM-命令模式的实现与应用
MVVM-命令模式的实现与应用
绑定
这个其实前面已经讲过一部分
使用{Binding}设置数据绑定,将控件的属性绑定到 ViewModel 的相应属性。
比如说需要注意,在xaml中绑定的不再是UserName和Password了,而是loginModel.UserName和loginModel.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项目中查看。
MVVM-命令模式的实现与应用的更多相关文章
- js架构设计模式——理解javascript中的MVVM开发模式
理解javascript中的MVVM开发模式 http://blog.csdn.net/slalx/article/details/7856769 MVVM的全称是Model View ViewMod ...
- 设计模式(六):控制台中的“命令模式”(Command Pattern)
今天的博客中就来系统的整理一下“命令模式”.说到命令模式,我就想起了控制台(Console)中的命令.无论是Windows操作系统(cmd.exe)还是Linux操作系统(命令行式shell(Comm ...
- 设计模式--命令模式Command(对象行为型)
一.命令模式 将一个请求封装为一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. (1)Command类:是一个抽象类,类中对需要执行的命令进行 ...
- 从Undo,Redo谈命令模式
一般的应用软件中,通常会提供Redo和Undo的操作,比如Paint.NET中的动作面板,Word中的撤销重做,一般我们按Ctrl-Z即可回退到上次操作. 要实现上面的这一功能,最直观的想法就是,我们 ...
- C#设计模式系列:命令模式(Command)
1.命令模式简介 1.1>.定义 命令模式的目的是解除命令发出者和接收者之间的紧密耦合关系,使二者相对独立,有利于程序的并行开发和代码的维护.命令模式的核心思想是将请求封装为一个对象,将其作为命 ...
- (十三)WebGIS中工具栏的设计之命令模式
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 从这一章节开始我们将正式进入WebGIS的工具栏中相关功能的 ...
- php实现设计模式之 命令模式
<?php /* * 命令模式:(行为模式)将一个请求封装成一个对象(命令封装成对象),从而可以使用不同的请求对客户参数化(客户的不同请求,调不同的封装对象), * 对请求排序,或者记录请求日志 ...
- 十一个行为模式之命令模式(Command Pattern)
定义: 将一个请求封装成对象,使得请求发送者和请求接受者之间相互隔离,消除两者之间的耦合.引入命令类,使得不同请求对客户参数化,并且可以对命令添加附件操作,如:排队.撤销.日志.组合等. 结构图: C ...
- 设计模式C#实现(十五)——命令模式
意图 0 适用性 1 结构 2 实现 3 效果 4 参考 5 意图 将请求封装成一个对象,客户接受请求参数:可以对请求排队或者记录请求日志,以及可以支持撤销操作 适用性 抽象出待执行的动作以参数化某对 ...
- [Head First设计模式]餐馆中的设计模式——命令模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
随机推荐
- 少样本学习实战:Few-Shot Prompt设计
让AI用最少样本学会"举一反三" 想象一下,你要教一个外星人认识地球上的动物.如果只给它看三张哈士奇的照片,它可能会认为所有四条腿的动物都叫"哈士奇".这就是A ...
- 【P3】Logisim搭建单周期MIPS-CPU
最近在想,我究竟能从计组课程中学到什么.依葫芦画瓢地搭一个CPU不难,但稍微设想一下从无到有设计指令,构建数据通路控制器,再到优化为多周期.流水线,在权衡中各模块互相调节...整个过程复杂困难曲折到令 ...
- [tldr] 如何给自己的程序编写一个systemd服务
参考Systemd 入门教程:实战篇 配置文件 systemd使用配置文件作为程序服务启动的方式,分为可以自启动的和不能自启动的 就是enable和start的命令的区别 分为/etc/systemd ...
- U盘制作、安装Ubuntu系统
制作 ubuntu U盘启动盘 下载Ubuntu镜像 打开 Ubuntu 官网:https://ubuntu.com/download/desktop ,进入页面后,点击右边的[Download]按钮 ...
- 如何写自己的springboot starter?自动装配原理是什么?
如何写自己的springboot starter?自动装配原理是什么? 官方文档地址:https://docs.spring.io/spring-boot/docs/2.6.13/reference/ ...
- Ai满嘴顺口溜,想考研?浪费我几个小时
Trae + claude3.7 事情的经过是这样的: 我有个方法代码如下: /// <summary> /// 获取客户端列表 /// </summary> /// < ...
- [SDR] 蓝牙专项教程 —— 从 0 到 1 教小白基于 SDR 编写蓝牙协议栈
目录 前言 一.开题之作 二.动态发送 BLE 广播包 三.基于 PlutoSDR 实现 BLE 广播包的收发一体能力 四.基于 PlutoSDR 的 BLE 广播包的收发实现接入涂鸦智能 APP 教 ...
- 【Guava】IO工具
引言 Guava 使用术语 流来表示可关闭的,并且在底层资源中有位置状态的 I/O 数据流.字节流对应的工具类为 ByteSterams,字符流对应的工具类为 CharStreams. Guava 中 ...
- 谷歌SRE的7条原则
谷歌SRE的7条原则 拥抱合理的风险 最大化系统的稳定性不仅毫无意义,而且会适得其反.不切实际的可靠性目标限制了新功能交付给用户的速度,而且用户通常不会注意到极端的可用性(比如99.99999%),因 ...
- MySQL隐藏手机号
1.实现方法 通过MySQL的left.right.contact函数实现 2.语法说明 contact()函数 作用:将多个字符串连接成一个字符串 语法:concat(字符串1,....,字符串n) ...