我剛剛發現了一個INotifyPropertyChange接口。我設法實現了這個接口,並且一切正常。不過,我想知道是否有可能攔截代碼這一事件,並觸發一個功能 比方說,我有一個函數如何攔截NotifyPropertyChange事件
DoStuff()
,我wan't啓動此功能,每次property1,property2或property3變化。 當然,我可以把這個功能放在我的課上,但這不是一個好主意(我認爲)。
我剛剛發現了一個INotifyPropertyChange接口。我設法實現了這個接口,並且一切正常。不過,我想知道是否有可能攔截代碼這一事件,並觸發一個功能 比方說,我有一個函數如何攔截NotifyPropertyChange事件
DoStuff()
,我wan't啓動此功能,每次property1,property2或property3變化。 當然,我可以把這個功能放在我的課上,但這不是一個好主意(我認爲)。
如果您的意思是將處理此事件的內部方法,您可以通過在類構造函數中註冊事件來完成。例如:
public class AnswerViewModel : IAnswerViewModel
{
public event PropertyChangedEventHandler PropertyChanged;
private string content;
public AnswerViewModel()
{
PropertyChanged += (sender, args) => DoStuff();
}
public string Content
{
get { return content; }
set
{
content = value;
PropertyChanged(this, new PropertyChangedEventArgs("Content"));
}
}
public void DoStuff()
{
// this method will be called whenever PropertyChanged event raised
}
}
如果攔截方法屬於其他類:
public class PropertiesInterceptor
{
private readonly AnswerViewModel viewModel;
private readonly List<string> propertiesToIntercept =
new List<string> { "property1", "property2", "property3" };
public PropertiesInterceptor(AnswerViewModel viewModel)
{
this.viewModel = viewModel;
viewModel.PropertyChanged += OnPropertyChanged;
}
private void OnPropertyChanged(object sender, PropertyChangedEventArgs args)
{
if (propertiesToIntercept.Contains(args.PropertyName))
{
DoStuff();
}
}
private void DoStuff()
{
// Do something with viewModel
}
}
您可能希望將事件更改爲PropertyChanged + =(sender,args)=> if(args.PropertyName = =「property1」|| args.PropertyName ==「property2」|| args.PropertyName ==「property3」)DoStuff();' – 2010-09-09 16:55:24
嗯如果我想調用的函數在其他類中? – Berial 2010-09-09 16:58:37
@Berial,添加示例用法來截取不同的類比提高'PropertyChanged' – Elisha 2010-09-09 17:05:19
你需要用它來取代現有的NotifyPropertyChanged事件處理程序,或者只是當NotifyPropertyChanged被稱爲被調用?
如果你指的是第二,你可以簡單地註冊事件處理
編輯
如果屬性參數等於Property1您可以添加一個事件處理程序被調用的NotifyPropertyChanged,檢查, Property2或Property3,然後纔將其轉發給您要調用的實際功能。
當NotifyPropertyChanged被調用時,我需要調用函數 - 但只有當Property1,Property2或Property3被更改時 – Berial 2010-09-09 16:57:18
攔截PropertyChanged事件:
你可以從RaisePropertyChanged()方法火法:
public int Property1
{
get { return this.property1; }
set
{
if (this.property1 != value)
{
this.property1 = value;
RaisePropertyChanged("Property1");
}
}
}
private void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
DoStuff(); // Call DoStuff here.
}
偷以利沙的答案來回答你的問題在Merlyn的回答
public class AnswerViewModel : IAnswerViewModel
{
public event PropertyChangedEventHandler PropertyChanged;
private string property1;
private string property2;
private string propertyX;
public AnswerViewModel()
{
PropertyChanged += (sender, args) =>
{
if(args.PropertyName == "Property1" || args.PropertyName == "Property2")
DoStuff();
}
}
public string Property1
{
get { return content; }
set
{
property1 = value;
PropertyChanged(this, new PropertyChangedEventArgs("Property1"));
}
}
public string Property2
{
get { return content; }
set
{
property2 = value;
PropertyChanged(this, new PropertyChangedEventArgs("Property2"));
}
}
public string PropertyX
{
get { return content; }
set
{
propertyX = value;
PropertyChanged(this, new PropertyChangedEventArgs("PropertyX"));
}
}
public void DoStuff()
{
// this method will be called whenever PropertyChanged event raised from Property1 or Property2
}
}
如果類DoS凝灰岩在是你可以做的成員
private otherClass
public AnswerViewModel()
{
PropertyChanged += (sender, args) =>
{
if(args.PropertyName == "Property1" || args.PropertyName == "Property2")
otherClass.DoStuff();
}
}
否則,你可以只讓其他類在自己的主代碼中註冊一個事件。
請在問題中指定有其他屬性需要過濾掉,這會引發NotifyPropertyChanged事件 – 2010-09-09 21:04:50