INotifyPropertyChanged, Interface

Data Object(class) impliment INotifyPropertyChanged; then the Object can update BindingSource.

Implimentation

   public abstract class NotifyProperyChangedBase : INotifyPropertyChanged
    {
        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

        #region methods

        protected bool CheckPropertyChanged<T>(string propertyName, ref T oldValue, ref T newValue)
        {
            if (oldValue == null && newValue == null)
            {
                return false;
            }

            if ((oldValue == null && newValue != null) || !oldValue.Equals((T)newValue))
            {
                oldValue = newValue;

                FirePropertyChanged(propertyName);

                return true;
            }

            return false;
        }

        protected void FirePropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

            }
        }

        #endregion

    }

Use

    class NotifiablePerson : MyComponentModel.NotifyProperyChangedBase
    {
        private string _firstName;

        public string FirstName
        {
            get { return _firstName; }
            set
            {
                if (this.CheckPropertyChanged<string>("FirstName", ref _firstName, ref value))
                {
                    this.DisplayNameChanged();
                }
            }
        }

        private string _lastName;

        public string LastName
        {
            get { return _lastName; }
            set
            {
                if (this.CheckPropertyChanged<string>("LastName", ref _lastName, ref value))
                {
                    this.DisplayNameChanged();
                }
            }
        }

        public string DisplayName
        {
            get { return _firstName + " " + _lastName; }
        }

        private void DisplayNameChanged()
        {
            this.FirePropertyChanged("DisplayName");
        }
    }

One Way binding => textBox event -> textBox1_TextChanged(object sender, EventArgs e) update Data/Property -> Property update another control(listBox2.DataSource = nl;).

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            LoadRegularList();

            LoadNotiList();
        }

        private void LoadRegularList()
        {
            System.ComponentModel.BindingList<RegularPerson> rl = new System.ComponentModel.BindingList<RegularPerson>();

            RegularPerson rp = rl.AddNew();
            rp.FirstName = "John";
            rp.LastName = "Smith";

            RegularPerson rp2 = rl.AddNew();
            rp2.FirstName = "Joe";
            rp2.LastName = "Shmoe";

            listBox1.DataSource = rl;
        }

        private void LoadNotiList()
        {
            System.ComponentModel.BindingList<NotifiablePerson> nl = new System.ComponentModel.BindingList<NotifiablePerson>();

            NotifiablePerson np = nl.AddNew();
            np.FirstName = "Jane";
            np.LastName = "Doe";

            NotifiablePerson np2 = nl.AddNew();
            np2.FirstName = "Mary";
            np2.LastName = "Smith";

            listBox2.DataSource = nl;
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (listBox1.SelectedItem != null)
            {
                ((RegularPerson)listBox1.SelectedItem).FirstName = textBox1.Text;
            }
        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {
            if (listBox1.SelectedItem != null)
            {
                ((RegularPerson)listBox1.SelectedItem).LastName = textBox2.Text;
            }
        }

        private void textBox3_TextChanged(object sender, EventArgs e)
        {
            if (listBox2.SelectedItem != null)
            {
                ((NotifiablePerson)listBox2.SelectedItem).FirstName = textBox3.Text;
            }
        }

        private void textBox4_TextChanged(object sender, EventArgs e)
        {
            if (listBox2.SelectedItem != null)
            {
                ((NotifiablePerson)listBox2.SelectedItem).LastName = textBox4.Text;
            }
        }
    }

TextBox(First Name, Last Name) => Notifiable Person => ListBox

时间: 2024-10-25 00:36:48

INotifyPropertyChanged, Interface的相关文章

利用微软认知服务实现语音识别功能

想实现语音识别已经很久了,也尝试了许多次,终究还是失败了,原因很多,识别效果不理想,个人在技术上没有成功实现,种种原因,以至于花费了好多时间在上面.语音识别,我尝试过的有科大讯飞.百度语音,微软系.最终还是喜欢微软系的简洁高效.(勿喷,纯个人感觉) 最开始自己的想法是我说一句话(暂且在控制台上做Demo),控制台程序能识别我说的是什么,然后显示出来,并且根据我说的信息,执行相应的行为.(想法很美好,现实很糟心)初入语音识别,各种错误各种来,徘徊不定的选择哪家公司的api,百度上查找各种语音识别的

WPF(6):概念绑定

WPF 的体系结构,标记扩展,依赖属性,逻辑树/可视化树,布局,转换等.今天,我们将讨论 WPF 最重要的一部分——绑定.WPF 带来了优秀的数据绑定方式,可以让我们绑定数据对象,这样每次对象发生更改都能引发对应的改变.数据绑定最主要的目的是确保 UI 上的改变总是自动和内部的对象结构同步.在进一步讨论前,我们先看一下我们已经讨论过的问题. 数据绑定技术是在 WPF 技术之前就出现了.在 ASP.NET 中,我们通过绑定数据元素来渲染控件中适当的数据.我们通常传入一个 DataTable 并且绑

WPF日积月累之DataGrid样式以及操作数据模板中的控件

一.效果图 二.代码预览 1 <Window x:Class="Test.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/exp

INotifyPropertyChanged 接口

2016-07-24 INotifyPropertyChanged 接口 用于向客户端(通常是执行绑定的客户端)发出某一属性值已更改的通知. 例如,考虑一个带有名为 FirstName 属性的 Person 对象.若要提供一般性属性更改通知,则 Person 类型实现 INotifyPropertyChanged 接口并在 FirstName 更改时引发 PropertyChanged 事件. 若要在将客户端与数据源进行绑定时发出更改通知,则绑定类型应具有下列任一功能: 实现 INotifyPr

谈谈INotifyPropertyChanged和ICommand

WPF,Windows8和Windows Phone开发中的MVVM设计模式中很重要的两个接口是INotifyPropertyChanged和ICommand,深入理解这两个接口的原理,并掌握其正确的使用方法,对熟练使用MVVM模式有很大的好处. MVVM模式最大的好处在于使表现层和逻辑层分离,这得益于微软XAML平台的绑定机制,在绑定机制中发挥重要作用的两个接口是INotifyPropertyChanged和ICommand.表现层(View层)是逻辑层(ViewModel层)的高层,所以表现

INotifyPropertyChanged接口的PropertyChanged 事件

INotifyPropertyChanged 接口用于向客户端(通常是执行绑定的客户端)发出某一属性值已更改的通知. 例如,考虑一个带有名为 FirstName 属性的 Person 对象. 若要提供一般性属性更改通知,则 Person 类型实现 INotifyPropertyChanged 接口并在 FirstName更改时引发 PropertyChanged 事件. 若要在将客户端与数据源进行绑定时发出更改通知,则绑定类型应具有下列任一功能: 实现 INotifyPropertyChange

MVVM设计模式基础知识--INotifyPropertyChanged接口

在.NET平台上,数据绑定是一项令人十分愉快的技术.利用数据绑定能减少代码,简化控制逻辑. 通常,可以将某个对象的一个属性绑定到一个可视化的控件上,当属性值改变时,控件上的显示数据也随之发生变化.要实现这一功能,只需要为自定义对象实现 INotifyPropertyChanged 接口即可.此接口中定义了 PropertyChanged 事件,我们只需在属性值改变时触发该事件即可. INotifyPropertyChanged 接口是 WPF/Silverlight 开发中非常重要的接口, 它构

NHibernate &amp; INotifyPropertyChanged

One of the things that make NHibernate easy to use is that it fully support the POCO model. But one of the things that most people do not consider is that since NHibernate did the hard work of opening up the seams to allow external persistence concer

Adding New Functions to MySQL(User-Defined Function Interface UDF、Native Function)

catalog 1. How to Add New Functions to MySQL 2. Features of the User-Defined Function Interface 3. User-Defined Function 4. UDF Argument Processing 5. UDF Return Values and Error Handling 6. UDF Compiling and Installing 7. Adding a New Native Functio