winform实现MVVM
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
winform实现MVVM 1. 实现一个VM模型
public class Person : INotifyPropertyChanged {
#region 字段
private string name;
private int age;
private int phone;
#endregion
#region 属性
public string Name
{
get
{
return name;
}
set
{
name = value;
OnPropertyChanged("Name");
}
}
public int Age
{
get
{
return age;
}
set
{
age = value;
OnPropertyChanged("Age");
}
}
public int Phone
{
get
{
return phone;
}
set
{
phone = value;
OnPropertyChanged("Phone");
}
}
#endregion
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string PropName) {
if(PropertyChanged!=null)
{
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(PropName));
}
}
}
模型类必须引用INotifyPropertyChanged接口
2. 窗口控件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JYmdG2WD-)(…/Image/image-.png)]
每个Textbox的Tag属性分别设置为对象的属性名
3. 窗体代码
public partial class FrmMain : Form
{
private Person VModel;
public FrmMain()
{
InitializeComponent();
VModel = new Person()
{
Age = 16,
Name = "SHH",
Phone = 123
};
}
/// <summary>
/// 递归获取所有控件
/// </summary>
/// <param name="ctl"></param>
/// <returns></returns>
private List<Control> GetAllControl(Control ctl)
{
List<Control> result = new List<Control>(); if (ctl.HasChildren)
{
if (!(ctl is Form)) result.Add(ctl);
foreach (Control item in ctl.Controls) {
result.AddRange(GetAllControl(item));
}
}
else
{
result.Add(ctl);
}
return result;
}
/// <summary>
/// 重写Load事件,绑定数据
/// </summary>
/// <param name="e"></param>
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
List<Control> list = GetAllControl(this);
var propes =
VModel.GetType().GetProperties();
try
{
foreach (Control item in list)
{
var prop = propes.FirstOrDefault(a => item.Tag != null && == item.Tag.ToString());
if (prop != null)
{
if (item is TextBox)
item.DataBindings.Add(new Binding("Text", VModel, ));
}
}
}
catch (Exception)
{
throw;
}
}
private void btnShow_Click(object sender, EventArgs e)
{
MessageBox.Show(Newtonsoft.Json.JsonConvert.SerializeO bject(VModel));
}
private void btnChange_Click(object sender, EventArgs e)
{
VModel.Age = 100;
VModel.Phone = 9999;
= "laksjdlks";
}
}
4. 实现思路
1.VM模型引用INotifyPropertyChanged接口,当属性发生
改变时,即执行了set访问器,触发事件
2.将控件的tag属性与模型属性一一匹配
3.遍历窗体控件,实现界面和模型数据的双向绑定
5. 注意事项
1.这里只是实现了双向绑定,单向影响没有实现
2.ViewModel与Model之间的转换没有实现
3.GetAllControl方法并不能获取所有控件
4.不同类型的属性值需要绑定不同的控件,这个需要另外
一一测试
参考网站。