当前上下文中不存在OnPropertyChange

本文关键字:不存在 OnPropertyChange 上下文 | 更新日期: 2023-09-27 18:25:01

似乎看不出哪里出了问题?OnPropertyChange没有被重新定义,有什么建议吗?

  public class MedicationList : INotifyPropertyChanged 
{

    public int MedicationID { get; set; }
    public string Description
    {
        get
        {
            return Description;
        }
        set
        { 
            OnPropertyChanged( "Description" );
            Description = value;
        }
    }
}

}

编辑我添加了public class MedicationList : INotifyPropertyChanged

当前上下文中不存在OnPropertyChange

您应该实现INotifyPropertyChanged接口,该接口声明了单个PropertyChanged事件。如果对象的某些属性发生了更改,则应该引发此事件。正确实施:

public class MedicationList : INotifyPropertyChanged
{
    private string _description; // storage for property value
    public event PropertyChangedEventHandler PropertyChanged;
    public string Description
    {
        get { return _description; }
        set
        {
            if (_description == value) // check if value changed
                return; // do nothing if value same
            _description = value; // change value
            OnPropertyChanged("Description"); // pass changed property name
        }
    }
    // this method raises PropertyChanged event
    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null) // if there is any subscribers 
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

我打赌你想做这样的事情:

public class MedicationList : INotifyPropertyChanged {
  public int MedicationID { get; set; }
  private string m_Description;
  public string Description {
    get { return m_Description; }
    set {
      m_Description = value;
      OnPropertyChanged("Description");
    }
  }
  private void OnPropertyChanged(string propertyName) {
    if (string.IsNullOrEmpty(propertyName))
      throw new ArgumentNullException("propertyName");
    var changed = PropertyChanged;
    if (changed != null) {
      changed(this, new PropertyChangedEventArgs(propertyName));
    }
  }
  public event PropertyChangedEventHandler PropertyChanged;
}

您需要接口在类中实现的实际代码。

/// <summary>
/// Public event for notifying the view when a property changes.
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
/// <summary>
/// Raises the PropertyChanged event for the supplied property.
/// </summary>
/// <param name="name">The property name.</param>
internal void OnPropertyChanged(string name)
{
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(name));
    }
}

此方法需要由您的类型定义,以引发INotifyPropertyChanged::PropertyChanged事件

public PropertyChangedEventHandler PropertyChanged;
...
private void OnPropertyChanged(string propertyName) {
  var saved = PropertyChanged;
  if (saved != null) { 
    var e = new PropertyChangedEventArgs(propertyName);
    saved(this, e);
  }
}

基类和接口之间有区别。

对于基类,成员是自动继承的,不需要执行任何操作(除非某些成员需要override)。对于接口,类不会自动继承接口成员;你必须在课堂上介绍他们。如果你不这样做,编译器就会抱怨。

INotifyPropertyChanged是一个接口。

您需要固有的BaseViewModel。

public class MedicationList : BaseViewModel