ببینید برای اینکه در صورت تغییر مقدار، کار خاصی اتفاق بیفته کافیه اون عمل را در setter پراپرتی فراخوانی کنید و یا یک رویداد را raise کرد که میتونه رویدادی باشه که خدتون تعریف کردید یا از رویداد های PropertyChangingEventHandler و PropertyChangedEventHandler استفاده کنید.
پیاده سازی:
ابتدا یک پراپرتی به کلاس اضافه کنید از همان نوع متغیر.
سپس کافیه یک رویداد از هر کدام از انواع PropertyChangingEventHandler و PropertyChangedEventHandler ایجاد کنید. فراخوانی هر کدام از این دو رویداد را در متدی انجام دهید. و متدها را قبل و بعد از تغییر مقدار در setter فراخوانی کنید.
برای آنکه هیچ چیز را فراموش نکنید میتوانید کلاس خود را از دو اینترفیس INotifyPropertyChanging, INotifyPropertyChanged ارث بری کنید تا مجبور باشید این خاصیت ها را پیاده کنید.
مثال:
using System.ComponentModel;
public class MyClass : INotifyPropertyChanging, INotifyPropertyChanged
{
private string myVariable;
public string MyProperty
{
get { return myVariable; }
set
{
if (value != myVariable)
{
OnMyPropertyChanging();
myVariable = value;
OnMyPropertyChanged();
}
}
}
public event PropertyChangingEventHandler PropertyChanging;
virtual protected void OnMyPropertyChanging()
{
if (PropertyChanging != null)
{
PropertyChanging(this, new PropertyChangingEventArgs("MyProperty"));
}
}
public event PropertyChangedEventHandler PropertyChanged;
virtual protected void OnMyPropertyChanged()
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("MyProperty"));
}
}
}
طریقه استفاده هم که فرقی نداره:
private void button2_Click(object sender, EventArgs e)
{
MyClass m = new MyClass();
m.PropertyChanging += new PropertyChangingEventHandler(m_PropertyChanging);
m.PropertyChanged +=new PropertyChangedEventHandler(m_PropertyChanged);
m.MyProperty = "aaa";
}
void m_PropertyChanging(object sender, PropertyChangingEventArgs e)
{
MessageBox.Show("before");
}
void m_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
MessageBox.Show("after");
}