wpfmvvm从入门到精通3:数据绑定

lonelyxmas lonelyxmas     2023-03-13     347

关键词:

原文:WPF MVVM从入门到精通3:数据绑定

?

WPF MVVM从入门到精通1:MVVM模式简介

WPF MVVM从入门到精通2:实现一个登录窗口

WPF MVVM从入门到精通3:数据绑定

WPF MVVM从入门到精通4:命令和事件

WPF MVVM从入门到精通5:PasswordBox的绑定

WPF MVVM从入门到精通6:RadioButton等一对多控件的绑定

WPF MVVM从入门到精通7:关闭窗口和打开新窗口

WPF MVVM从入门到精通8:数据验证

完整示例代码下载LoginDemo

?

我们前面已经说过,现在后端和前端可以分头行事了。我们先来看看后端要做的事情。

对应于用户名输入框,ViewModel里面应该有一个相应的对象。当这个对象状态发生改变时,需要向View发出一个通知。因为所有的属性都要做这么一个事情,我们把通知这件事放到一个基类里面。

using System.ComponentModel;

namespace LoginDemo.ViewModel.Common

    public abstract class NotificationObject : INotifyPropertyChanged
    
        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// 发起通知
        /// </summary>
        /// <param name="propertyName">属性名</param>
        public void RaisePropertyChanged(string propertyName)
        
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        
    

这个基类所做的事情,就是当我们调用RaisePropertyChanged的时候,就会通知View,propertyName这个属性改变了,你要做出相应的处理了。

那我们现在的ViewModel,应该是怎样的呢,代码如下:

using LoginDemo.ViewModel.Common;

namespace LoginDemo.ViewModel.Login

    public class LoginViewModel : NotificationObject
    
        public LoginViewModel()
        
            obj.UserName = "test";
        

        /// <summary>
        /// Model对象
        /// </summary>
        private LoginModel obj = new LoginModel();        

        /// <summary>
        /// 用户名
        /// </summary>
        public string UserName
        
            get
            
                return obj.UserName;
            
            set
            
                obj.UserName = value;
                this.RaisePropertyChanged("UserName");
            
        
    

我们声明了一个LoginModel的私有对象,用于存储真正的数据内容。而属性UserName,当设置它的值时,它就会发出名为"UserName"这个属性改变的通知。

可能有的人会觉得,Model和ViewModel有太多重复的内容。或许有人会删掉Model类,然后把ViewModel改成这样:

using LoginDemo.ViewModel.Common;

namespace LoginDemo.ViewModel.Login

    public class LoginViewModel : NotificationObject
    
        private string userName;
        /// <summary>
        /// 用户名
        /// </summary>
        public string UserName
        
            get
            
                return userName;
            
            set
            
                userName = value;
                this.RaisePropertyChanged("UserName");
            
        
    

这样的设计在最终效果上是一样的,但我并不建议。我们可能会遇到这样的场合:把所有数据保存到一个文件,然后在下次打开软件的时候还原。如果有Model类,我们使用序列化就可以很方便地实现这一功能。当然,Model类存在的理由并不止这一个。所以虽然麻烦一点,我还是建议做一个Model类。

那么后端还要做些什么呢?其实对于UserName的处理,已经完成了。我们现在来看看前端要做的事情。

我们说过,前端存在着大量的绑定。我们使用绑定的方法,把用户名输入框绑定到名为UserName的属性上。

<TextBox Grid.Row="0" Grid.Column="1" Margin="5" Text="Binding UserName"/>

代码是相当简单的。我们现在就可以运行软件,然后看到用户名输入框里显示test。当我们修改其内容,在输入框失去焦点时,ViewModel里面的UserName也会变成输入框输入的内容。

至此,前后端的工作都完成了。

wpfmvvm从入门到精通8:数据验证(代码片段)

原文:WPFMVVM从入门到精通8:数据验证 WPFMVVM从入门到精通1:MVVM模式简介WPFMVVM从入门到精通2:实现一个登录窗口WPFMVVM从入门到精通3:数据绑定WPFMVVM从入门到精通4:命令和事件WPFMVVM从入门到精通5:PasswordBox的绑... 查看详情

wpfmvvm从入门到精通4:命令和事件(代码片段)

原文:WPFMVVM从入门到精通4:命令和事件 ?WPFMVVM从入门到精通1:MVVM模式简介WPFMVVM从入门到精通2:实现一个登录窗口WPFMVVM从入门到精通3:数据绑定WPFMVVM从入门到精通4:命令和事件WPFMVVM从入门到精通5:PasswordBox的... 查看详情

wpfmvvm从入门到精通7:关闭窗口和打开新窗口

原文:WPFMVVM从入门到精通7:关闭窗口和打开新窗口 WPFMVVM从入门到精通1:MVVM模式简介WPFMVVM从入门到精通2:实现一个登录窗口WPFMVVM从入门到精通3:数据绑定WPFMVVM从入门到精通4:命令和事件WPFMVVM从入门到精通5:... 查看详情

wpfmvvm从入门到精通3:数据绑定

我们前面已经说过,现在后端和前端可以分头行事了。我们先来看看后端要做的事情。对应于用户名输入框,ViewModel里面应该有一个相应的对象。当这个对象状态发生改变时,需要向View发出一个通知。因为所有的属性都要做这... 查看详情

wpfmvvm从入门到精通4:命令和事件

这一部分我们要做的事情,是把点击登录按钮的事件也在ViewModel里实现。若不是用MVVM模式,可能XAML文件里是这样的:<ButtonGrid.Row="3"Grid.ColumnSpan="2"Content="登录"Width="200"Height="30"Click="Button_Click"/>而跟XAML文件相关的CS文件里则... 查看详情

wpfmvvm从入门到精通2:实现一个登录窗口

我们究竟要做一个怎样的东西呢?直接上图:这看起来比较简单,但把这个登录窗口做完,MVVM的入门就基本完成了。(为什么登录界面要选择性别这么奇怪?无非是因为RadioButton的绑定也是一个课题)很多教程都是举一个小例子... 查看详情

wpfmvvm从入门到精通1:mvvm模式简介

刚开始接触和使用MVVM模式的时候,就有一种感觉:哇,实现这么一丁点的功能,竟然要写这么多代码,太麻烦了吧!但是后来当我熟悉了这种模式之后,感觉就变成了:哇,还是这么麻烦。没错,使用MVVM模式的确要在项目中增... 查看详情

vuejs从入门到精通(代码片段)

尚硅谷Vue2.0+Vue3.0全套教程,全网最新最强vuejs从入门到精通001课程简介002vue简介003Vue官网使用指南004搭建Vue开发环境005Hello小案例006分析Hello案例007模板语法008数据绑定009el与data的两种写法010理解MVVM011Object.define013Vue中的数... 查看详情

es6从入门到精通#10:set集合数据类型(代码片段)

说明ES6从入门到精通系列(全23讲)学习笔记。Set集合集合:表示无重复值的有序列表letkaimo=newSet();console.log(kaimo)添加元素letkaimo=newSet();kaimo.add(3);kaimo.add("1");kaimo.add(3);kaimo.add([3,1,3])con 查看详情

oracle从入门到精通系列讲解-总目录(代码片段)

总目录欢迎大家来到Lucifer三思而后行的《Oracle从入门到精通系列》,开始前博主先列出Oracle学习的大纲,同时这也可以作为大家学习Oracle的参考。下面蓝字都是传送门,点击进入即可:学前必读Oracle从入门到精通... 查看详情

mybatis从入门到精通—源码剖析之二级缓存细节(代码片段)

⼆级缓存构建在⼀级缓存之上,在收到查询请求时,MyBatis⾸先会查询⼆级缓存,若⼆级缓存未命中,再去查询⼀级缓存,⼀级缓存没有,再查询数据库。⼆级缓存------》⼀级缓存------》数据库与⼀级缓存不同,⼆级缓存和具体... 查看详情

vue2从入门到精通详解vue数据双向绑定原理及手动实现双向绑定(代码片段)

文章目录✨什么是数据双向绑定✨数据双向绑定的原理✨Vue数据双向绑定原理✨实现数据双向绑定的步骤✨手动实现自定义组件的双向绑定的步骤✨写在最后✨什么是数据双向绑定我们先从单向绑定切入单向绑定非常简单,... 查看详情

《wireshark从入门到精通》

 视频选集3/20P1wireshark从入门到精通P2wireshark入门到精通2P3wireshark入门到精通3P4wireshark入门到精通4P5wireshark入门到精通5P6wireshark入门到精通6P7wireshark入门到精通7P8wireshark入门到精通8P9wireshark入门到精通9P10wireshark入门到精通10P11w... 查看详情

dp问题从入门到精通3(区间dp,计数dp)(代码片段)

DP问题从入门到精通系列DP问题入门到精通1DP问题入门到精通2.1DP问题入门到精通2.2​​​​​​​DP问题入门到精通4DP问题入门到精通5有时候dp问题真的不能光看,看是真的看不出答案的,要自己动手去写去研究才会有结... 查看详情

css从入门到精通3.md

版心和布局流程阅读报纸时容易发现,虽然报纸中的内容很多,但是经过合理地排版,版面依然清晰、易读。同样,在制作网页时,要想使页面结构清晰、有条理,也需要对网页进行“排版”。“版心”(可视区)是指网页中主体... 查看详情

starrocks从入门到精通系列五:导入数据

StarRocks从入门到精通系列五:导入数据一、导入总览二、从ApacheKafka®持续导入三、使用ApacheSpark™批量导入四、从ApacheFlink持续导入一、导入总览下图详细展示了在各种数据源场景下,应该选择哪一种导入方式。数据导入是指将... 查看详情

es6从入门到精通系列学习笔记23篇(完结)

说明ES6从入门到精通系列(全23讲)学习笔记。可以自行搜索B站,有小马哥的视频学习。目录ES6从入门到精通#01:ES6介绍ES6从入门到精通#02:let和const命令ES6从入门到精通#03:模板字符串ES6从入门到精通#04&... 查看详情

es6从入门到精通#10:set集合数据类型(代码片段)

说明ES6从入门到精通系列(全23讲)学习笔记。Set集合集合:表示无重复值的有序列表letkaimo=newSet();console.log(kaimo)添加元素letkaimo=newSet();kaimo.add(3);kaimo.add("1");kaimo.add(3);kaimo.add([3,1,3])console.log(kaimo)删除元素k... 查看详情