首页 > 编程语言 >[C#] [WPF] MVVMToolkit入门案例心得

[C#] [WPF] MVVMToolkit入门案例心得

时间:2024-03-28 15:14:05浏览次数:35  
标签:MVVMToolkit C# isEnabled Title 生成器 RelayCommand private 按钮 WPF

跟着做的第一个MVVM项目, 学到一点基础的东西, 记下来; 有些用词不准确
假设我们要做一个页面, 通过按钮来控制上方文本框的文字, 通过勾选框来控制按钮的激活状态⬇️
image

一般流程

需要3个属性, 2个私有属性, 1个RelayCommand属性代表按钮点击后事件, 并配有相应的getter/setter

文本框的内容title

private string _title = "Hello World!";
public string Title
{
    get => _title;
    set { SetProperty(ref _title, value); }
}

按钮的激活状态isEnabled

private bool _isEnabled;
public bool IsEnabled
{
    get => _isEnabled;
    set
    {
        SetProperty(ref _isEnabled, value);
        ButtonClickCommand.NotifyCanExecuteChanged();
    }
}

按钮点击事件处理ButtonClickCommand

在类构造器里创建RelayCommand对象, 指定其Execute和CanExecute参数(注意lambda的使用)

public RelayCommand ButtonClickCommand { get; }
public MainWindowViewModel()
{
    ButtonClickCommand = new RelayCommand(() => Title = "Hooray!!", () => IsEnabled);
}

然后在xaml文件里绑定这些值就行了

生成器

MVVMToolkit提供了生成器的功能, 通过标签的方式简化代码, 省去了一些重复格式的代码i.e.属性方法, 同时也能保证后台与前端的数据同步变化

两个私有属性

添加标签ObservableProperty, 编译时会自动生成公共属性Title以及方法

[ObservableProperty]
private string _title = "Hello World!";

同理, 这样会生成IsEnabled
⚠️ 注意上面写isEnabled的时候, 用到了一个NotifyCanExecuteChanged的方法, 是用来提醒按钮事件的; 使用生成器后, 我们需要标签NotifyCanExecuteChangedFor来保证这一行的功能

[ObservableProperty]
[NotifyCanExecuteChangedFor(nameof(ButtonClickCommand))]
private bool _isEnabled;

按钮事件

当我们有复数个按钮的事件需要处理时, 反复指定RelayCommand是不效率的(坏文明
同样可以用生成器简化操作, 不需要单独指定以及构造器⬇️
⭐因为我们不在构造器里指定按钮事件了, 所以在这里使用生成器时, 注意把漏掉的都补上
⭐RelayCommand标签将ButtonClick自动识别为一个RelayCommand属性(对象, 反正是那个意思)
⭐传入一个CanExecute参数(Func<bool>), 本来写的是一个lambda式返回了IsEnabled值, 但是这里不能这样写
nameof的作用是将方法名字符串化, 不能传入lambda

[RelayCommand(CanExecute = nameof(canButtonClick))]
private async Task ButtonClick()
{
    // 为了这个延迟效果才用了Task类型
    // ButtonClick执行时会先停1s, 同时按钮灰掉, 然后才会enabled和变化Title
    await Task.Delay(1000);
    Title = "Hooray!!";
}

// 我觉得这里的逻辑和之前的lambda格式是一样的, 只是给了一个名字, 作为CanExecute参数
private bool canButtonClick() => IsEnabled;

标签:MVVMToolkit,C#,isEnabled,Title,生成器,RelayCommand,private,按钮,WPF
From: https://www.cnblogs.com/Akira300000/p/18101142

相关文章

  • 使用fabric.js框选图片区域并生成svg图
    仍然是在图片上特定区域根据数值显示不同的颜色的需求,改进下代码。增加了测量辅助线、对齐辅助线、生成svg图等,基本满足需求。demo中包括了生成json、svg字符串和下载svg图。<scriptsrc="../plugins/fabric.min.js"></script><scriptsrc="../plugins/aligning_guidelines.......
  • 挑战程序设计竞赛 2.6章习题 poj 3421 X-factor Chains
    https://vjudge.net/problem/POJ-3421#author=GPT_zhGivenapositiveintegerX,anX-factorchainoflengthmisasequenceofintegers,1=X0,X1,X2,…,Xm=XsatisfyingXi<Xi+1andXi|Xi+1wherea|bmeansaperfectlydividesintob.Nowwea......
  • SVG描边 - CSS3实现动画绘制矢量图
    使用SVG的stroke-dasharray及stroke-dashoffset,结合CSS3animation实现画笔绘制矢量图的动画效果,如下:html<svgxmlns="http://www.w3.org/2000/svg"pointer-events="none"class="leaflet-zoom-animated"width="1452"heigh......
  • etcd与redis之间的区别
    一、简介我们之前用了redis,那么好用为什么还要来用etcd呢,这里就来和大家聊聊为什么有的业务场景选择etcd。分析:在当今的分布式系统中,数据存储及一致性相当重要。etcd和redis都是我们最受欢迎的开源分布式数据存储的解决方案,但是他们有着不同的试用场景。下面我个人对其中二个的......
  • [Ad Hoc Networks] 当隐私计算(Privacy Computing)遇上元宇宙(Metaverse)!
     往期热门推送(持续更新中!):[ICASSP2024]CDNMF:一个可信且高效的社区检测(社区发现,图聚类,CommunityDetection)方法-CSDN博客论文链接:https://arxiv.org/abs/2311.02357ContrastiveDeepNonnegativeMatrixFactorizationForCommunityDetection|IEEEConferencePublic......
  • 在Vue.js框架中,activated和created的区别
    在Vue.js框架中,activated和created两个钩子函数都是在组件被创建时执行的函数,但它们的使用场景略有不同。createdcreated钩子函数是在组件被创建(即实例化)时执行的,可以用它来初始化组件的数据、监听事件、调用方法等操作。它是组件生命周期中的第一个钩子函数,通常用于组件初......
  • SAP Fiori开发中的JavaScript基础知识1 - 背景介绍
    1.背景开发SAPFiori应用程序过程中,不可避免的要用到JavaScript去增强或影响UI的行为。对于传统ABAPer,JavaScript的语言特性和风格与ABAP是有较大的不同的。接下来的一段时间,我会尝试整理在SAPFiori开发过程中会常用到的一些JavaScript基础知识,并结合介绍在SAPBAS中开发Fio......
  • C++入门————第一天
    1、命名空间     在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。  1......
  • SAP Fiori开发中的JavaScript基础知识2 - 变量,操作符,值,类型
    1.JavaScript代码示例在介绍JavaScript具体语法前,让我们先看一段在Web应用程序过程中的JS代码片。<!DOCTYPEhtml><html> <head> <metacharset="utf-8"/> <title>FirstJavaScriptApplication!</title> <scriptsrc="js/myExternal.js&q......
  • Flashback Database闪回数据库功能实践
    FlashbackDatabase闪回数据库功能极大地降低了由于用户错误导致的数据丢失的恢复成本。这是一种以空间换取缩短恢复时间的解决方案,这是值得的。这里给出闪回数据库的使用方法,体验一下这种恢复操作的便利性。1.使用FlashbackDatabase的前提条件1)启用了flashbackdatabase2)必须打......