WPF MVVM从入门到精通3:数据绑定
转载:https://blog.csdn.net/lweiyue/article/details/88864734
我们前面已经说过,现在后端和前端可以分头行事了。我们先来看看后端要做的事情。
对应于用户名输入框,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(new PropertyChangedEventArgs(propertyName));
}
}
}
这个基类所做的事情,就是当我们调用RaisePropertyChanged的时候,就会通知View,propertyName这个属性改变了,你要做出相应的处理了。
现在的viewmodel代码如下
using LoginDemo.ViewModel.Common;
namespace LoginDemo.ViewModel.Login
{
public class LoginViewModel:NotificationObject
{
/// <summary>
/// Model对象
/// </summary>
private LoginModel obj = new LoginModel();
public LoginViewModel()
{
obj.UserName="test";
}
/// <summary>
/// 用户名
/// </summary>
public string UserName
{
get
{
return obj.UserName;
}
set
{
obj.UserName = value;
this.RaisePropertyChanged(nameof(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 Text="{Binding UserName}" />
代码是相当的简单的。我们现在就可以运行软件,然后看到用户我输入框里面显示test。当我们修改其内容时,在输入框失去焦点时,ViewModel里面的UserName也会变成输入框输入的内容。
至此,前后端的工作都完成了。
相关文章
- 什么是WPF_windows程序设计教程
- WPF实现选项卡效果(3)——自定义动态添加的AvalonDock选项卡内容
- WPF基础五:UI①布局元素WrapPanel[通俗易懂]
- 解决WPF在XP上使用微软雅黑字体
- WPF进阶之MVVM教程(二)(附源码下载)
- WPF 实现水珠效果按钮组
- 开源WPF控件库推荐:ModernWpf
- WPF任务栏同步进度
- 02Prism WPF 入门实战 - 建项
- WPF-带填充的 WrapPanel
- 能快速构建和定制网络拓扑图的WPF开源项目-NodeNetwork
- 【愚公系列】2023年04月 Halcon机器视觉-WPF中使用Halcon进行联合编程
- WPF与Oracle数据库的无缝结合(wpforacle)
- WPF连接MySQL:实现步骤深度剖析(wpf 连接mysql)
- WPF的数据绑定详细介绍
- wpf将表中数据显示到datagrid示例