我已經在自定義類中使用INotifyPropertyChanged
在變量發生變化時觸發事件,但我想知道是否有一種簡單的方法在單個變量的變化上觸發事件,例如作爲一個雙。雙重價值變化引發的火事件
例如,在一個WPF應用程序,如果我在MainWindow.xaml.cs
有
private double a;
,是有火的任何時間a
被分配到事件簡單方式?
我已經在自定義類中使用INotifyPropertyChanged
在變量發生變化時觸發事件,但我想知道是否有一種簡單的方法在單個變量的變化上觸發事件,例如作爲一個雙。雙重價值變化引發的火事件
例如,在一個WPF應用程序,如果我在MainWindow.xaml.cs
有
private double a;
,是有火的任何時間a
被分配到事件簡單方式?
如果我理解正確,您需要爲a創建一個Setter,然後觸發properychange事件/自定義事件而不是將a
封裝到類中。
事情是這樣的:
private double a;
public double A
{
get { return a; }
set { a = value;
firepropertyChange(a);
}
}
一個字段沒有任何跟蹤更改的方法。爲了使其工作,它需要是一個財產,並且需要處理跟蹤。這是INotifyPropertyChanged
接口的用途。
跟蹤此值變化的常規方法是在您的班級中實施INotifyPropertyChanged
。
是(取決於),如果你通過屬性包住變量訪問和改變激發您的活動,並確保所有訪問該變量是通過屬性像
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;
...否則,沒有
如果您正在使用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); }
}
}
提供一個字符串參數是怎麼樣的不良作風和非通用。你應該提供'A'本身 –
@StefanoL你是部分正確的,雖然在這種情況下並不壞。請參閱http://msdn.microsoft.com/en-us/library/ms133020.aspx,此外,它是一個硬編碼值,用戶輸入出現問題 – Jason