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不工作

INotifyPropertyChanged with singelton class

这是因为在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(); }    
}