2013-04-03 47 views
0

我使用INotifyPropertyChanged來通知班級,其中特定對象的變量發生任何變化時。即使在註冊後,屬性更改事件爲空

下面是類:

public class MyClass 
{ 
     public SecClass MyObj { get; set; } 

    //A few more variables 
} 

SecClass:

public class SecClass:INotifyPropertyChanged 
{ 
    private bool _noti= false; 

    public bool Noti 
    { 
     get { return _noti; } 
     set 
     { 
      _noti= value; 
      NotifyPropertyChanged("Noti"); 
     } 
    } 

    //A few more variables 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(string name) 
    { 
     if (PropertyChanged != null) 
     { 
     PropertyChanged(this, new PropertyChangedEventArgs(name)); 
     } 
    } 
} 

這裏我的功能,使活動報名:

public void Register() 
    { 
     MyObj.PropertyChanged += MyObj_PropertyChanged;   
    } 

功能的工作原理,並登記已完成,但當涉及到更改它顯示爲Property Change爲空(我猜somewhe重新註冊刪除,之前發生的變化,我怎麼能檢查)

+0

顯示一些代碼,請在您註冊你的意思是像'Register'方法的事件處理程序 –

+1

@ bash.d? –

+0

,你創建對象並對其進行初始化代碼 –

回答

2

我一起迷上這樣:

static class Program 
{ 
    static void Main() 
    { 
     var c = new MyClass(); 
     c.MyObj = new SecClass(); 
     c.Register(); 
     c.MyObj.Noti = !c.MyObj.Noti; 
    } 
} 

增加(僅供說明):

private void MyObj_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    Console.WriteLine(e.PropertyName); 
} 

MyClass,並且:

public event PropertyChangedEventHandler PropertyChanged; 

SecClass(讓他們編譯),它的工作原理很好 - 在運行時打印"Noti"。有理論線程的比賽,但它是非常不可能在任何理智的用法,但推薦的用法是:

var handler = PropertyChanged; 
if (handler != null) 
{ 
    handler(this, new PropertyChangedEventArgs(name)); 
} 

此外,對於信息:如果添加[CallerMemberName]到,你不需要明確指定屬性:

private void NotifyPropertyChanged([CallerMemberName] string name = null) {...} 

有:

NotifyPropertyChanged(); // the compiler adds the "Noti" itself 

,但有趣悲傷地:「不能重現」 - 它工作正常。我想知道這是否與你的PropertyChanged實現有關,因爲你實際上並沒有表現出來。特別是,我不知道你實際上有事件:一個明確的實施。那就意味着你的演員會受到不同的對待。