2010-04-19 52 views
2

這個問題可能看起來有點微不足道,但它可能不是。我只是想知道下面哪兩種情況更適合間接財產通知,或者有更好的辦法。間接財產通知

場景:

我有兩個屬性,第一個是叫HoldingObject對象,第二個是一個名爲IsHoldingObject布爾值,它是假的,如果HoldingObject == null,否則這是真的。我只是想知道什麼是IsHoldingObject最好的通知機制:

情況(A) - 通知IsHoldingObject從HoldingObject proeperty改變:

public class NotifyingClass1 : INotifyPropertyChanged 
{ 
    private object _holdingObject; 
    public object HoldingObject 
    { 
     get { return _holdingObject; } 
     set 
     { 
      if (_holdingObject != value) 
      { 
       _holdingObject = value; 
       NotifyPropertyChanged("HoldingObject"); 
       // Notify from the property that is being checked 
       NotifyPropertyChanged("IsHoldingObject"); 
      } 
     } 
    } 

    public bool IsHoldingObject { get { return this.HoldingObject == null; } } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

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

    #endregion 
} 

情況(B) - 通知IsHoldingObject從IsHoldingObject直接改變通過從HoldingObject屬性設置爲false或真:因爲它需要更少的代碼,但我不知道它是怎麼推薦做

public class NotifyingClass2 : INotifyPropertyChanged 
{ 
    private object _holdingObject; 
    public object HoldingObject 
    { 
     get { return _holdingObject; } 
     set 
     { 
      if (_holdingObject != value) 
      { 
       _holdingObject = value; 
       NotifyPropertyChanged("HoldingObject"); 

       // 1) Set the property here 
       this.IsHoldingObject = _holdingObject != null; 
      } 
     } 
    } 

    private bool _isHoldingObject; 
    public bool IsHoldingObject 
    { 
     get { return _isHoldingObject; } 
     set 
     { 
      if (_isHoldingObject != value) 
      { 
       _isHoldingObject = value; 

       // 2) Notify directly from the property 
       NotifyPropertyChanged("IsHoldingObject"); 
      } 
     } 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

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

    #endregion 
} 

我個人偏向於第一種。讓我知道如果有另一種(更好的)方式。

謝謝!

回答

0

有趣的想法。我想,我會使用BindingConverter方法,它將HoldingObject轉換爲您喜歡的值。

我很好奇其他意見。

問候

1

我幾乎總是去的第二個。這樣,所有負責設置給定屬性的代碼都在同一個地方。在這種特殊情況下,IsHoldingObject屬性完全依賴於HoldingObject屬性,因此它可能不適用。但是總的來說,現在可能會少一些代碼,但如果您以後需要從其他位置更新該屬性,會發生什麼情況?

您有(該代碼的詳細程度)的疼痛可以由用於設置在一個視圖模型(這可以生活在一個基類)性質的輔助方法能夠容易地減輕:

​​

然後您的房產變爲:

private object _holdingObject; 
public object HoldingObject 
{ 
    get { return _holdingObject; } 
    set 
    { 
     if (SetValue(ref _holdingObject, value, "HoldingObject"))    
      this.IsHoldingObject = _holdingObject != null; 
    } 
} 

private bool _isHoldingObject; 
public bool IsHoldingObject 
{ 
    get { return _isHoldingObject; } 
    private set { SetValue(ref _isHoldingObject, value, "IsHoldingObject"); } 
} 
+0

+1這正是我要做的事。 – rossisdead 2010-04-19 21:15:40

1

在大多數情況下,這並不重要。讓我們看看選項

  • 計算每次。所以在這裏,每次UI請求值時都要消耗CPU。但考慮到每次用戶界面需要每秒鐘請求100s的數量時,你甚至會注意到一個命中之前需要多少CPU。我懷疑你的UI會需要這個。
  • 存儲值。這裏你正在消耗內存。除非存儲許多大型對象,否則這不是問題。

所以我想它歸結爲什麼對你來說更具可讀性。我更喜歡「每次計算」。然後使用這個http://code.google.com/p/notifypropertyweaver/它可以讓我寫這個代碼

public class NotifyingClass1 : INotifyPropertyChanged 
{ 
    public object HoldingObject { get; set; } 

    public bool IsHoldingObject { get { return HoldingObject == null; } } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

而且有這個編譯成彙編(即依賴派生)

public class NotifyingClass1 : INotifyPropertyChanged 
{ 
    private object holdingObject; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public virtual void OnPropertyChanged(string propertyName) 
    { 
     var propertyChanged = PropertyChanged; 
     if (propertyChanged != null) 
     { 
      propertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public object HoldingObject 
    { 
     get { return holdingObject; } 
     set 
     { 
      if (holdingObject !=value) 
      { 
       holdingObject = value; 
       OnPropertyChanged("HoldingObject"); 
       OnPropertyChanged("IsHoldingObject"); 
      } 
     } 
    } 

    public bool IsHoldingObject { get { return (HoldingObject == null); } } 
}