WPF 绑定相关

绑定的五种模式

1、 OneWay:从源的改变更新目标的属性
2、 TwoWay:源与目标相互改变
3、 OneTime:只根据源来设置目标,以后都不会改变
4、 OneWayToSource:目标的改变使源发生变化
5、 Default:可以单向亦可双向,是靠被指定的源或目标是否有get或set指定,所以绑定的话是需要选择上面4个中的一个模式进行绑定,根据所需来选择,不选则默认为Default

MVVM中的数据交互

在MVVM模式中,界面的目标数据和后台代码中的数据源一般需要进行相互绑定,即改变界面目标数据时数据源会发生变化,改变数据源时界面显示的目标数据会发生变化。前者的实现十分简单,只需要将后台数据属性添加上getter和setter,在前台xaml绑定相应的数据属性即可,当修改界面的目标数据时,监控到后台数据也发生了相应的变化。需要额外的效果可以参考上述五种绑定模式。而要使目标数据随着数据源的改动而刷新,除了直接更改界面目标数据外,还可以实现后台直接对数据源的修改直接更新到数据上,此时就需要借助一些其他方法达到目的。

  • 方法一:INotifyPropertyChanged接口
    是绑定最常用到也是最基本的接口方法。首先在需要用到的cs文件中添加System.ComponentModel命名空间,在需要实现数据绑定的类后实现INotifyPropertyChanged接口,在需要绑定的属性的setter,getter中添加PropertyChanged.Invoke方法即可,代码如下:
        public event PropertyChangedEventHandler PropertyChanged;
        private string title = "App";
        public string Title
        {
            get { return title; }
            set 
            {
                title = value;
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Title"));
                   
                }
            }
        }

还有另外一种写法,实现接口后添加NotifyPropertyChanged方法,在setter中触发该方法即可,代码如下:

        private string title = "App";
        public event PropertyChangedEventHandler PropertyChanged;
        public string Title
        {
            get { return title; }
            set 
            {
                title = value;
                if (this.PropertyChanged != null)
                {
                    this.title = value;
                    NotifyPropertyChanged("Title");
                }
            }
        }

        private void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }
  • 方法二:NuGet中的PropertyChanged.fody包
    如果项目较复杂,需要绑定的数据源太多,那么实现INotifyPropertyChanged就显得十分复杂,需要重复很多次getter和setter,代码量巨大。此时可以用NuGet中的PropertyChanged.fody包,使得代码看起来十分简洁。首先在NuGet中下载Fody包,安装完成后在要用到的项目中cs项目中添加PropertyChanged命名空间,在需要绑定的类前添加AddINotifyPropertyChangedInterface特性(Atrribute),getter和setter无需修改
    代码如下:
[AddINotifyPropertyChangedInterface]
    public class MainWindowViewModel
    {
        public string Title { get; set; } = "App";
        //后续省略
    }
  • 方法三:Prism框架中的BindableBase
    在使用MVVM的Prism框架时,自动生成的view和viewmodel文件会一一对应,并且相应的viewmodel文件会继承BindableBase(存在 Prism.Mvvm命名空间中),这是框架内部已经封装好的类,该类已经实现了INotifyPropertyChanged接口,继承后无需做过多处理,添加需要绑定的数据源时可使用快捷代码段propp自动生成可绑定交互的数据源。代码如下:
       private string title = "App";
       public string Title
        {
            get { return title; }
            set {SetProperty(ref title ,value);}
        }

以上是目前我所用到的绑定的后台编辑方法,前台的xaml直接绑定后台数据即可,如果需要其他效果可以参考Binding的其他属性,例如Mode,NotifyOnTargetUpdated等等后续使用再详细描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值