簡體   English   中英

為什么我的事件總是為空?

[英]Why my event is always null?

我正在嘗試使用事件引發代碼。 但是,每當事件引發時, if語句就永遠不會為true,因為PropertyChanged始終為null。

 public delegate void MyEventHandler(object sender, String change);
 public event MyEventHandler PropertyChanged;

 protected virtual void NotifyPropertyChanged(string propertyName)
 {
      if (PropertyChanged != null) //It is always null here
      {
           PropertyChanged(this, propertyName);
      }
 }

這是我訂閱此活動的方式:

data.facebook.PropertyChanged+=new Facebook.MyEventHandler(Facebook_PropertyChanged);
data.PropertyChanged+= new RootObject.MyEventHandler( data_PropertyChanged);

這是班

public class Facebook
{
    public Facebook()
    {
        _commentsbox_count = 0;
        _comment_count = 0;
        _click_count = 0;
        _like_count = 0;
        _share_count = 0;
        _total_count = 0;
    }
    double _commentsbox_count;
    double _click_count;
    double _total_count;
    double _comment_count;
    double _like_count;
    double _share_count;

public double commentsbox_count
{
    get {
         return _commentsbox_count; 
    }
    set {
    _commentsbox_count = value;
    NotifyPropertyChanged("commentsbox_count");
    }
}
public double click_count {
    get
    {
        return _click_count;
    }
    set
    {
        _click_count = value;
        NotifyPropertyChanged("click_count");
    }
}
public double total_count {
    get
    {
        return _total_count;
    }
    set
    {
        _total_count = value;
        NotifyPropertyChanged("total_count");
    }
}
public double comment_count {
    get
    {
        return _comment_count;
    }
    set
    {
        _comment_count = value;
        NotifyPropertyChanged("comment_count");
    }
}
public double like_count {
    get
    {
        return _like_count;
    }
    set
    {
        _like_count = value;
        NotifyPropertyChanged("like_count");
    }
}
public double share_count {
    get
    {
        return _share_count;
    }
    set
    {
        _share_count = value;                
        NotifyPropertyChanged("share_count");
    }
}

public delegate void MyEventHandler(object sender, String change);
public event MyEventHandler PropertyChanged;

protected virtual void NotifyPropertyChanged(string propertyName)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, propertyName);
    }
}
}

public class RootObject
{
    public RootObject()
    {
        _stumbleUpon = 0;
        _twitter = 0;
        _reddit = 0;
        _pinterest = 0;
        _linkedin = 0;
        _googleplusone = 0;
        _diggs = 0;
        _delicious = 0;
        _buzz = 0;
    }
    public Facebook facebook=new Facebook();
    double _stumbleUpon;
    double _reddit;
    double _delicious;
    double _googleplusone;
    double _buzz;
    double _twitter;
    double _diggs;
    double _pinterest;
    double _linkedin;

public double StumbleUpon {
    get
    {
        return _stumbleUpon;
    }
    set
    {
        _stumbleUpon = value;
        NotifyPropertyChanged("StumbleUpon");
    }
}
public double Reddit {
    get
    {
        return _reddit;
    }
    set
    {
        _reddit = value;
        NotifyPropertyChanged("Reddit");
    }
}
public Facebook Facebook { 
    get 
    { 
        return facebook; 
    }
    set 
    {
        facebook = value;
    }
}
public double Delicious {
    get
    {
        return _delicious;
    }
    set
    {
        _delicious = value;
        NotifyPropertyChanged("Delicious");
    }
}
public double GooglePlusOne {
    get
    {
        return _googleplusone;
    }
    set
    {
        _googleplusone = value;
        NotifyPropertyChanged("GooglePlusOne");
    }
}
public double Buzz
{
    get
    {
        return _buzz;
    }
    set
    {
        _buzz = value;
        NotifyPropertyChanged("Buzz");
    }
}
public double Twitter
{
    get
    {
        return _twitter;
    }
    set
    {
        _twitter = value;
        NotifyPropertyChanged("Twitter");
    }
}
public double Diggs
{
    get
    {
        return _diggs;
    }
    set
    {
        _diggs = value;
        NotifyPropertyChanged("Diggs");
    }
}
public double Pinterest
{
    get
    {
        return _pinterest;
    }
    set
    {
        _pinterest = value;
        NotifyPropertyChanged("Pinterest");
    }
}
public double LinkedIn
{
    get
    {
        return _linkedin;
    }
    set
    {
        _linkedin = value;
        NotifyPropertyChanged("LinkedIn");
    }
}
public delegate void MyEventHandler(object sender, String change);
public event MyEventHandler PropertyChanged;

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

}

這就是初始化數據的方式

RootObject data = new RootObject();

可能的原因是什么?

更新資料

好吧,我明白了。 將值分配給數據時,將創建一個臨時Facebook對象。 然后將其復制到data.Facebook(復制構造函數)。 這就是為什么該臨時Facebook對象未訂閱並在事件中提供null的原因。 由於它是使用復制構造函數復制的。 在data.facebook中未觸發NotifyPropertyChanged。 現在我把范圍縮小了。 但是我不知道這是怎么回事。 有什么建議嗎?

僅當您將事件處理程序添加到類的另一個實例時,才有可能。 檢查是否還有其他實例?

另外,為什么不使用內置的INotifyPropertyChanged接口並為此創建自己的委托?

編輯

正如我在您的代碼中看到的那樣,您創建了Facebook類的實例:

Facebook facebook = new Facebook();

但是您不訂閱實例的PropertyChanged事件。

此外,您允許其他開發人員在此處用另一個類替換Facebook類的實例:

public Facebook Facebook { 
    get 
    { 
        return facebook; 
    }
    set 
    {
        facebook = value;
    }
}  

因此,另一個未初始化的對象可能會存儲在這里。 我建議刪除公共集。

最后:我看不到這兩個類如何相互聯系。 我只看到在RootObject實例化的Facebook類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM