【avalonia教程】17mvvm简介、command

好,我们到这里已经演示了下mvvm的基础用法了,现在该简单的介绍下了mvvm的概念了。

mvvm,实际上是Model-View-ViewModel的简称,这三个部分的作用如下:

  • Model: 数据模型层,负责处理业务逻辑和数据

  • View: 视图层,负责用户界面展示,在您提供的代码中对应 MainWindow

  • ViewModel: 视图模型层,作为View和Model之间的桥梁,处理UI逻辑

简单的说,就是Model负责存储相关数据、处理业务逻辑,View负责将数据展示出来,ViewModel则是两者的中间层,负责实现数据互通。

这么做有以下好处:

  • 数据绑定: View和ViewModel之间通过数据绑定实现自动同步
  • 命令绑定: UI操作通过命令绑定到ViewModel中的方法
  • 分离关注点: 将UI逻辑与业务逻辑分离,提高代码可维护性
  • 可测试性: ViewModel不依赖具体UI,便于单元测试

有小伙伴可以有疑问了:View这里是指TextBox控件的Text属性我可以理解,ViewModel指的是MainWindowViewModel我可以理解,但是我没有看到Model呢?实际上啊,这里是把ViewModel和Model集成到一起了。这也是很多mvvm框架的常见方式,比如vue。

学完mvvm这种模式后,我们再回过头来看之前的那张图,是不是就容易理解了:

最后我们再说下Command模式。之前我们定义Button的点击操作,是在Click里面去做的。也可以用Command的形式去做,代码如下:

xml 复制代码
<Button Command="{Binding AddItem}">add</Button>
c# 复制代码
public partial class MainWindowViewModel: ObservableObject
{
    [ObservableProperty]
    private string? _pageDesc = "abcd";
    
    [RelayCommand]
    public void AddItem()
    {
        PageDesc += 'a';
    }
}

这里先解答大家可能会有的两个疑问:

  1. 为什么用command和click的效果看着是一样的?

    通过查看源码发现,Click中调用了Command方法

  2. 既然两者一样,那我为什么不用click而要用command,click看着还更简单诶

    个人关于这块的理解是:有时候一个窗口或控件,会绑定不同的DataContext,如果用click,还需要对DataContext的类型做判断后,采用不同的逻辑

相关推荐
Bs_MoneyMagnet2 小时前
基于springboot+vue的滑雪场票务与装备租赁系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·毕业设计·计算机毕业设计
AlienZHOU6 小时前
AI Coding 时代下,我的技术面试实践分享
前端·后端·面试
Captaincc10 小时前
AI用量v0.1.11更新发布 新增 jusage doctor 诊断指令 托盘展示token 和余额 新增 AutoClaw 支持
前端·后端·vibecoding
计算机魔术师11 小时前
德国Wiki被黑后两周,OpenAI终于把模型失控的账本摊开了
前端
kyriewen12 小时前
我让 AI 当面试官面了我一轮:第 3 个追问我就卡住了(附 10 道追问清单)
前端·面试·ai编程
IT_陈寒12 小时前
Python的GIL把我坑惨了,多线程跑得比单线程还慢
前端·人工智能·后端
前端snow12 小时前
ai agent --- 多agent框架之图编排引擎-langgraph
前端
竹林81812 小时前
OmniPic Studio v3.2.1 核心技术架构与全平台发版解析文档
前端·浏览器
JamesZhang8007812 小时前
页面内存只涨不跌? 一次泄漏排查, 牵出 WeakMap 的诞生
前端
Z小明12 小时前
第 6 章 组件进阶
前端·vue.js