1

私はsingeltonクラス内にINotifyPropertyChangedを実装しようとしています。

これが私のコードです:

public class 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

1

コードにはいくつかの問題があります。

  • シングルトンを実装している場合、クラスのコンストラクターはプライベートにする必要があります
  • プライベート プロパティの代わりにフィールドを使用する
  • プロパティは静的であってはなりません (シングルトンを使用しています)
  • OnPropertyChanged イベントを発生させる前に、プロパティ値が実際に変更されたかどうかを確認します
  • プロパティ値を返す前にイベントを発生させる
  • クラス名とプロパティ名に PascalNames を使用する
  • ゲッターではなくセッターからイベントを発生させる

コード:

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 に答える