[C#] 資料繫結 (Data Binding)(四) 屬性變更通知

  • 10899
  • 0

[C#] 資料繫結 (Data Binding)(三) 屬性變更通知

Introduction

當連結的資料來源的值持續改變時,我們該如何通知控制項更新資料。

我們必須通知表單資料執行階段資料來源已經變更,否則表單不會更新控制項,解決的方法就是撰寫事件。

 

Examples

因為抓圖無法顯示出更新控制項的效果,可以直接參考程式碼。

UI 介面偕統一

2010-01-30_154234

sample1 不會更新控制項

CurrentTime.cs

 

    public class CurrentTime {
        internal System.Windows.Forms.Timer _timer;
        private DateTime _now = DateTime.Now;

        public CurrentTime() {
            //**************************************************************
            // 使用一個 Timer 物件來追蹤目前的計時器。
            //**************************************************************
            _timer = new System.Windows.Forms.Timer();
            _timer.Tick += new EventHandler(_timer_Tick);

            //**************************************************************
            // 每秒更新時間一次。
            //**************************************************************
            _timer.Interval = 1000;
            _timer.Start();
        }

        public DateTime Now {
            get {
                return _now;
            }

            set {
                if ((_now != value)) {
                    _now = value;
                }
            }
        }

        void _timer_Tick(object sender, EventArgs e) {
            this.Now = DateTime.Now;
        }
    }

Form1.cs

 

        private void Form1_Load(object sender, EventArgs e) {
            CurrentTime oCurrentTime = new CurrentTime();

            // 將 txtTime 控制項的 Text 屬性繫結至 oCurrentTime 物件的 Now 屬性。
            Binding myBinding = new Binding("Text", oCurrentTime, "Now", true);
            myBinding.FormatString = "yyyy/MM/dd hh:mm:ss";
            this.txtTime.DataBindings.Add(myBinding);
        }

 

sample2 自訂事件通知資料來源已經變更

CurrentTimeEvent.cs

   public class CurrentTimeEvent {
        internal System.Windows.Forms.Timer _timer;
        private DateTime _now = DateTime.Now;

        public CurrentTimeEvent() {
            //**************************************************************
            // 使用一個 Timer 物件來追蹤目前的計時器。
            //**************************************************************
            _timer = new System.Windows.Forms.Timer();
            _timer.Tick += new EventHandler(_timer_Tick);

            //**************************************************************
            // 每秒更新時間一次。
            //**************************************************************
            _timer.Interval = 1000;
            _timer.Start();
        }

        public DateTime Now {
            get {
                return _now;
            }

            set {
                if ((_now != value)) {
                    _now = value;
                    //觸發事件
                    OnNowChanged(EventArgs.Empty);
                }
            }
        }

        void _timer_Tick(object sender, EventArgs e) {
            this.Now = DateTime.Now;
        }

        //*******************************************************************
        // 提供一個 "Property"Changed 事件。
        //*******************************************************************
        public event EventHandler NowChanged;

        protected void OnNowChanged(EventArgs e) {
            if (NowChanged != null) {
                NowChanged(this, e);
            }
        }
    }

 

Form2.cs

 

        private void Form2_Load(object sender, EventArgs e) {
            CurrentTimeEvent oCurrentTimeEvent = new CurrentTimeEvent();

            // 將 txtTime 控制項的 Text 屬性繫結至 oCurrentTimeEvent 物件的 Now 屬性。
            Binding myBinding = new Binding("Text", oCurrentTimeEvent, "Now", true);
            myBinding.FormatString = "yyyy/MM/dd hh:mm:ss";

            this.txtTime.DataBindings.Add(myBinding);
        }

 

sample3 繼承 INotifyPropertyChanged 介面通知屬性變更

CurrentTimeINotifyPropertyChanged.cs

//引入命名空間
using System.ComponentModel;
namespace TestBindingProperty {
    public class CurrentTimeINotifyPropertyChanged : INotifyPropertyChanged{
        internal System.Windows.Forms.Timer _timer;
        private DateTime _now = DateTime.Now;

        public CurrentTimeINotifyPropertyChanged() {
            //**************************************************************
            // 使用一個 Timer 物件來追蹤目前的計時器。
            //**************************************************************
            _timer = new System.Windows.Forms.Timer();
            _timer.Tick += new EventHandler(_timer_Tick);

            //**************************************************************
            // 每秒更新時間一次。
            //**************************************************************
            _timer.Interval = 1000;
            _timer.Start();
        }

        public DateTime Now {
            get {
                return _now;
            }

            set {
                if ((_now != value)) {
                    _now = value;
                    //觸發事件
                    OnPropertyChanged("Now");
                }
            }
        }

        void _timer_Tick(object sender, EventArgs e) {
            this.Now = DateTime.Now;
        }

        #region INotifyPropertyChanged 成員

        //*******************************************************************
        // 提供一個 INotifyPropertyChanged.PropertyChanged 事件。
        //*******************************************************************
        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

        protected void OnPropertyChanged(string propertyName) {
            OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
        }

        protected void OnPropertyChanged(PropertyChangedEventArgs e) {
            if (PropertyChanged != null) {
                PropertyChanged(this, e);
            }
        }
    }
}

 

Form3.cs

        private void Form3_Load(object sender, EventArgs e) {
            CurrentTimeINotifyPropertyChanged oCurrentTimeINotify = new CurrentTimeINotifyPropertyChanged();

            // 將 txtTime 控制項的 Text 屬性繫結至 oCurrentTimeINotify 物件的 Now 屬性。
            Binding myBinding = new Binding("Text", oCurrentTimeINotify, "Now", true);
            myBinding.FormatString = "yyyy/MM/dd hh:mm:ss";

            this.txtTime.DataBindings.Add(myBinding);
        }

 

Reference

程式碼下載TestBindingProperty.rar

三小俠  小弟獻醜,歡迎指教