Winform和WPF数据绑定区别小结

        首先说WPF,初识数据绑定这一概念,是在做了3年Winform开发,后转做WPF项目,按照MVVM模型进行编码时,才开始了解使用的。

        而一直以为数据绑定作为MVVM的核心内容,仅在WPF上适用,后来才了解到在Winform中同样适用,比较著名的比如DevExpress控件,相信做Winform开发的都会有所耳闻。

        那么,总结一下个人认识下来,对两者在数据绑定上的区别:

WPF:

核心接口:INotifyPropertyChanged

namespace System.ComponentModel
{
    //
    // 摘要:
    //     通知客户端属性值已更改。
    public interface INotifyPropertyChanged
    {
        //
        // 摘要:
        //     在属性值更改时发生。
        event PropertyChangedEventHandler PropertyChanged;
    }
}

核心DataSource容器:ObservableCollection继承自Collection,位于System.Collections.ObjectModel命名空间下

Winform和WPF数据绑定区别小结_第1张图片

使用过程:

①Model类集成INotifyPropertyChanged接口,在成员属性的set方法中,将自身属性名称作为参数,触发事件PropertyChanged;

②使用Model实例对WPF用户控件(可为单个原生控件,或原生控件组合而成的自定义控件)的DataSource进行赋值,完成绑定,注意控件的UpdateSourceTrigger设置;

③或使用ObservableCollection实例对WPF容器控件的DataSource进行赋值,完成绑定;

④对Model类实例的属性进行更新,可在绑定了该实例的控件上观察到属性变化;

——很直观的,其本质是控件内部代码对PropertyChanged事件及其参数的处理

Winform:

核心接口:仍是INotifyPropertyChanged

(容器控件)核心接口:IBindList

Winform和WPF数据绑定区别小结_第2张图片

用法大致同上,将ObservableCollection改为BindingList对Winform控件的DataSource进行赋值;

——(猜想本质)

①Model属性在后台代码中被赋值,将该属性名称作为参数PropertyChangedEventArgs触发PropertyChanged事件;

②并被进一步封装为ListChangedEventArgs触发容器类BindingList的ListChanged事件;

③而在OnListChanged的处理函数中,根据参数中的第一步的属性名称,通过类型为PropertyDescriptor(与其说是属性的基类,倒不如说是属性被封装后的集合)的SortPropertyCore属性检索到对应属性名改变后的值,并对控件进行重新绘制。

 单个控件(自定义控件后续了解后进行补充)

你可能感兴趣的:(C#,WPF,Winform,wpf)