1、MVP:Model-View-Presenter
2、MVC:Model-View-Controller
3、程序的本质:数据+算法
4、Binding不仅可以实现连接UI层和逻辑层,还可以在Binding中设置数据验证
5、属性的变化要通知到UI层,需要实现INotifyPropertyChanged接口
6、Binding的Path实际上会创建一个PropertyPath对象
7、Binding模型
7、一个典型的Binding(使用MVVM Light)
private string userName;
public string UserName
{
get { return userName; }
set
{
if (value != userName)
{
userName = value;
RaisePropertyChanged(() => this.UserName);
}
}
}
8、Binding对Source的要求并不苛刻,只要它是一个对象,并且通过属性(Property)公开自己的数据
9、BindingMode:控制数据流向
//
// Summary:
// 描述binding中的数据流方向
public enum BindingMode
{
//
// 双向改变
//
TwoWay = 0,
//
// 单向改变,当数据源更新时,目标也随之改变。适用于只读控件
//
OneWay = 1,
//
// 单次,在程序启动时或数据上下文(data context)改变时,更新绑定目标的值。
// 这是OneWay的简化版,如果数据源不再改变,OneTime会提供更好的性能
//
OneTime = 2,
//
// 单向改变,当目标值改变时,更新数据源的值
//
OneWayToSource = 3,
//
// 默认值。对每个依赖属性来说,BindingMode的默认值都不一样。通常来讲,用户可编辑控件的属性,如TextBox、CheckBox,默认值是TwoWay
// 对其它大多数控件来说one-way,要想确定一个依赖属性的BindingModel默认值,可以通过调用System.Windows.DependencyProperty.GetMetadata(System.Type)
// 然后检查System.Windows.FrameworkPropertyMetadata.BindsTwoWayByDefault的值是否为true
//
Default = 4
}
10、UpdateSourceTrigger:更新数据源的时机
//
// 描述binding更新数据源的时机
//
public enum UpdateSourceTrigger
{
//
// 对大多数依赖属性来讲,默认值是PropertyChanged,对于TextBox.Text属性,默认是值LostFocus
//
Default = 0,
//
// 当目标属性的值改变时立即改变数据源
//
PropertyChanged = 1,
//
// 目标控件失去焦点时,更新数据源属性值
//
LostFocus = 2,
//
// 显式调用System.Windows.Data.BindingExpression.UpdateSource方法时,更新数据源属性值
//
Explicit = 3
}
11、如果NotifyOnSourceUpdated和NotifyOnTargetUpdated设置为true,就可以通过监听SourceUpdated和TargetUpdated事件监听哪些属性改变,然后更新数据
12、Binding支持多级路径
或
集合类型的索引器(Indexer)又称为带参属性,因此可以作为Path使用,如
或者
当使用一个集合作为数据源时
//显示列表第一个实体的RealName值
public List UserList { get; set; } = new List();
UserList.Add(new UserInfoModel() { UserName = "testusername1", RealName = "cat1" });
UserList.Add(new UserInfoModel() { UserName = "testusername2", RealName = "cat2" });
当有列表嵌套时:(xaml4测试通过,和书中不一致,不知道是版本变化还是书中有误)
public class UserInfoModel : INotifyPropertyChanged
{
private string userName;
public string UserName
{
get { return userName; }
set
{
if (value != userName)
{
userName = value;
RaisePropertyChanged("UserName");
}
}
}
public List SubUserList { get; set; } = new List();
}
13、没有Path的绑定
或者
注意:在使用two-way绑定时,必须指定Path或者XPath
在后台绑定时,后台绑定(经测试和书中介绍有出入)
textBox.SetBinding(TextBox.TextProperty, new Binding() { Path = new PropertyPath(string.Empty), Mode = BindingMode.OneWay, Source = Resources["testString"] });
或者:
textBox.SetBinding(TextBox.TextProperty, new Binding() { Path = new PropertyPath("."), Source = Resources["testString"] });
书中介绍:
在xaml4中表现为TwoWay的Binding必须指定Path,而单向绑定可以不指定Path