我在自定义类中使用INotifyPropertyChanged
来在变量发生变化时触发事件,但我想知道是否有一种简单的方法可以在单个变量的更改上触发事件,例如double
例如,在WPF应用程序中,如果我有
private double a;
MainWindow.xaml.cs
中的,是否有{strong>简单方式在a
被分配到任何时间时触发事件?
答案 0 :(得分:3)
字段没有任何跟踪更改的方法。为了使其工作,它需要是一个属性,并且需要处理跟踪。这就是INotifyPropertyChanged
界面的目的。
跟踪此值更改的常规方法是在您的班级中实施INotifyPropertyChanged
。
答案 1 :(得分:2)
如果我理解正确,您需要为a创建一个Setter,然后触发properychange事件/自定义事件,而不是将a
封装到类中。
这样的事情:
private double a;
public double A
{
get { return a; }
set { a = value;
firepropertyChange(a);
}
}
答案 2 :(得分: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;
...否则,没有
答案 3 :(得分: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); }
}
}