INotifyPropertyChanged with singelton class
本文关键字:class singelton with INotifyPropertyChanged | 更新日期: 2023-09-27 17:57:34
我正在尝试在singelton类中实现INotifyPropertyChanged。
这是我的代码:
公共类plc:INotifyPropertyChanged{
private static plc instance; public plc() { } public static plc Instance { get { if (instance == null) { instance = new plc(); } return instance; } set { instance = value; } } private static string _plcIp{get; set;} public string plcIp { get { return _plcIp; OnPropertyChanged(); } set { _plcIp = value; } } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged([CallerMemberName]string propertyName = null) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } }
我正在删除无法访问的错误代码,当然NotifyPropertyChange不工作
这是因为在return _plcIp;
之后调用OnPropertyChanged();
。
应该在设置值之后调用它。即:
public string plcIp
{
get
{
return _plcIp;
}
set
{
if (value != _plcIp)
{
_plcIp = value;
OnPropertyChanged();
}
}
}
在引发事件之前,还应该检查setter中的值是否实际发生了更改。
您的代码中存在以下几个问题:
- 如果您正在实现singleton,那么类的构造函数应该是私有的
- 使用字段而不是私有属性
- 属性不应该是静态的(您使用的是singleton)
- 在引发OnPropertyChanged事件之前,验证属性值是否真的发生了更改
- 在返回属性值之前引发事件
- 使用PascalNames作为类名和属性名
- 从setter而不是getter引发事件
代码:
public class Plc : INotifyPropertyChanged {
private static Plc _instance;
private Plc() { } // constructor should be private
public static Plc Instance
{
get
{
if (_instance == null)
_instance = new Plc();
return _instance;
} // you don't need setter
}
private string _plcIp; // instance field instead of static property
public string PlcIp
{
get { return _plcIp; }
set
{
if (_plcIp == value)
return; // check if value changed
_plcIp = value; // change value
OnPropertyChanged(); // raise event
}
}
// ...
}
这包含错误:
public string plcIp
{
get
{
return _plcIp;
OnPropertyChanged(); //This row..
}
set { _plcIp = value; }
}
您希望在UI中更新的是Set方法,而不是当您获得值时。类似这样的东西:
public string plcIp
{
get { return _plcIp; }
set { _plcIp = value; OnPropertyChanged(); }
}