2 - 模型Models
在这个项目中只有一个数据模型,那就是qq账号数据。那么qq账号数据具有两个属性,一个是qq号,一个是密码。
mvvm架构中我们需要做的是“前后台分离”,所以大部分数据都是需要用到“数据绑定Binding”。数据绑定之后我们可能需要做修改、删除、新增这些动态操作,那就要用到INotifyPropertyChanged接口(用于通知客户端,通常执行绑定的客户端,属性值已更改)。
数据绑定在开发中非常常用和实用,在这个项目中比如我需要删掉一个错误的qq号,那么在我点击删除之后,界面的listview应该要把我删掉的那条数据从列表中remove掉,然后我们还要在“数据库”中将数据彻底删掉,这样才完成了删除操作。
如果不用数据绑定去写,我们需要做几个步骤呢?
1,在操作事件中获取到选中的数据;
2,将数据从“数据库”删除;
3,将数据从listview中移除。
一共需要3个步骤。如果我们使用了数据绑定,我们需要几个步骤?
1,将选中数据从“数据集合中”移除,更新“数据库”,完成。
是不是超级快。在数据绑定中我们不需要在后台代码中直接操作listview了,只需要操作listview绑定的数据即可,大大提升了开发效率和可维护性。
下面继续我们的项目,要用INotifyPropertyChanged,就要实现这个接口;
1,在Models文件夹下新建一个类,命名为:MyINotifyPropertyChanged.cs:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; namespace qqkeys.Models { public class MyINotifyPropertyChanged : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged([CallerMemberName]string propertyName = "") { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } } }
2,新建QQ数据模型:在Models文件夹下新建一个类,命名为QQModel.cs(每个数据模型都要继承MyINotifyPropertyChanged)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace qqkeys.Models { public class QQModel : MyINotifyPropertyChanged { private int qq_; public int qq { get { return qq_; } set { qq_ = value; OnPropertyChanged(); } } private string password_; public string password { get { return password_; } set { password_ = value; OnPropertyChanged(); } } } }
可以看到在QQModel中两个属性的set方法都调用了一个OnPropertyChanged();方法,就是我们第1步新建的MyINotifyPropertyChanged中的一个接口方法,这个方法就起到了负责通知客户端属性已经更改的作用。如果不实现这个接口不调用这个方法会发生什么呢?答案是我们操作绑定的数据后数据是能成功操作了,但是界面不会进行数据的更新,比如删掉一个qq号,数据上是删除掉了,但是界面上还是存在这个qq号。