1

我正在尝试在单格顿类中实现 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 不起作用

4

3 回答 3

3

这是因为你在呼唤OnPropertyChanged();return _plcIp;

设置值后应该调用它。IE:

public string plcIp
{
    get
    {
        return _plcIp;
    }
    set
    {
        if (value != _plcIp)
        {
            _plcIp = value;
            OnPropertyChanged();
        }
    }
}

在引发事件之前,您还应该检查 setter 中的值是否实际发生变化。

于 2013-02-04T10:26:53.613 回答
1

您的代码中有几个问题:

  • 如果你正在实现单例,那么类的构造函数应该是私有的
  • 使用字段而不是私有属性
  • 属性不应该是静态的(您使用的是单例)
  • 在引发 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               
        }    
    }    
    // ...
}
于 2013-02-04T10:34:11.577 回答
0

这包含错误:

public string plcIp
    {
        get
        {
            return _plcIp;
            OnPropertyChanged(); //This row..
        }
        set { _plcIp = value; }    
    }

您希望在 UI 中更新 Set 方法,而不是在获取值时。像这样的东西:

public string plcIp
{
    get { return _plcIp; }
    set { _plcIp = value; OnPropertyChanged(); }    
}
于 2013-02-04T10:28:50.707 回答