《深入浅出WPF》读书笔记之-Binding(1)

1、MVP:Model-View-Presenter

2、MVC:Model-View-Controller

3、程序的本质:数据+算法

4、Binding不仅可以实现连接UI层和逻辑层,还可以在Binding中设置数据验证

5、属性的变化要通知到UI层,需要实现INotifyPropertyChanged接口

6、Binding的Path实际上会创建一个PropertyPath对象

7、Binding模型

    《深入浅出WPF》读书笔记之-Binding(1)_第1张图片

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"] });

书中介绍:

《深入浅出WPF》读书笔记之-Binding(1)_第2张图片

在xaml4中表现为TwoWay的Binding必须指定Path,而单向绑定可以不指定Path

你可能感兴趣的:(WPF)