2013-06-12 53 views
2

我已經在自定義類中使用INotifyPropertyChanged在變量發生變化時觸發事件,但我想知道是否有一種簡單的方法在單個變量的變化上觸發事件,例如作爲一個雙。雙重價值變化引發的火事件

例如,在一個WPF應用程序,如果我在MainWindow.xaml.cs

private double a; 

,是有火的任何時間a被分配到事件簡單方式?

回答

2

如果我理解正確,您需要爲a創建一個Setter,然後觸發properychange事件/自定義事件而不是將a封裝到類中。

事情是這樣的:

private double a; 

    public double A 
    { 
     get { return a; } 
     set { a = value; 
       firepropertyChange(a); 
      } 
    } 
3

一個字段沒有任何跟蹤更改的方法。爲了使其工作,它需要是一個財產,並且需要處理跟蹤。這是INotifyPropertyChanged接口的用途。

跟蹤此值變化的常規方法是在您的班級中實施INotifyPropertyChanged

0

(取決於),如果你通過屬性包住變量訪問和改變激發您的活動,並確保所有訪問該變量是通過屬性像

private double a; 

public double PropertyA 
{ 
    get 
    { 
     return a; 
    } 
    set 
    { 
     // set value and fire event only when value is changed 
     // if we want to know when value set is the same then remove if condition 
     if (a != value) 
     { 
      a = value; 
      PropertyChanged("PropertyA"); 
     } 
    } 
} 

// when changing a, make sure to use the property instead... 
PropertyA = 5.2; 

...否則,沒有

+0

提供一個字符串參數是怎麼樣的不良作風和非通用。你應該提供'A'本身 –

+0

@StefanoL你是部分正確的,雖然在這種情況下並不壞。請參閱http://msdn.microsoft.com/en-us/library/ms133020.aspx,此外,它是一個硬編碼值,用戶輸入出現問題 – Jason

0

如果您正在使用C#5.0中,你可以使用CallerMemberName屬性是這樣的:

class MyData : INotifyPropertyChanged 
{ 
    private string _name; 
    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      _name = value; 
      RaisePropertyChanged(); 
     } 
    } 

    private string _anotherProperty; 
    public string AnotherProperty 
    { 
     get { return _anotherProperty; } 
     set 
     { 
      _anotherProperty = value; 
      RaisePropertyChanged(); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void RaisePropertyChanged([CallerMemberName] string caller = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(caller)); 
     } 
    } 
} 

正如你看到的,你只需要調用RaisePropertyChanged();set每個屬性,沒有遍地鍵入屬性名稱。

另一種方法是定義一個類ModelBase

class ModelBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected void Set<T>(ref T field, T value, [CallerMemberName] string propertyName = "") 
    { 
     if (!Object.Equals(field, value)) 
     { 
      field = value; 

      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

然後推導模型從ModelBase

class Conf : ModelBase 
{ 
    NodeType _nodeType = NodeType.Type1; 

    public NodeType NodeType 
    { 
     get { return _nodeType; } 
     set { Set(ref _nodeType, value); } 
    } 
}