如何通知对象实例之外的属性?

How to notify Properties outside of an Object instance?

我是 WPF 初学者,我对 PropertyChanged 事件有疑问:

我有一个包含另一个视图模型实例的视图模型。 (我在这里使用通用名称)

我想要 AxisVM 的实例通知我的 SomeDouble 属性。 (不能使用转换器)

编辑:我没有在此处包含完整的 类,PropertyChangedEvent 显然已实现。

public class ViewModel : INotifyPropertyChanged
{
   private AxisVM axis;
 
   public ViewModel()
   {
      this.AxisVM = new AxisVM();
   }
   
   public AxisVM Axis
   {
     get { return axis}; 
     set { axis = value; FireOnPropertyChanged(); }
   }

   public double SomeDouble
   {
     get { return axis.Lowerlimit * 1.5 }; 
   }

}

AxisVM也继承自INotifyPropertyChanged(我用的是ClassMemberName)

public class AxisVM: INotifyPropertyChanged
{
   private double lowerLimit;

   public double LowerLimit
   {
     get { return lowerLimit }; 
     set { lowerLimit = value; FireOnPropertyChanged(); }
   }

}

在 XAML 中,我将 Viewmodel 绑定为 DataContext(我认为在这种情况下无关紧要),然后将下限绑定到文本框。

当我编辑文本框时,轴的下限事件被触发并且值被更改(视图和视图模型)但我需要通知我的 SomeDouble 属性 因为它在下限更改时更新。

我的 ViewModel 中轴实例的 属性 更改事件从未被触发,即使我访问了它的 属性 (它确实触发了它的事件但没有通知我的 SomeDouble 属性).

我现在很茫然,感谢任何帮助。

当您在 AxisVM 中实现 INotifyPropertyChanged 时,您在其中添加了 PropertyChanged 事件。在 ViewModel 中处理并触发 FireOnPropertyChanged()

Axis.PropertyChanged += OnAxisVMPropertyChanged(...)
void OnAxisVMPropertyChanged(..)
{
    // Check property name
    // Fire OnPropertyChanged for LowerLimit
}

您可以为此使用一个事件。

在您的 AxisVM 中添加事件

public class AxisVM: INotifyPropertyChanged
{
   public event EventHandler LowerLimitChanged;  

   private double lowerLimit;

   public double LowerLimit
   {
     get { return lowerLimit }; 
     set { lowerLimit = value; FireOnPropertyChanged(); LowerLimitChanged?.Invoke(this, EventArgs.Empty); }
   }
}

并像这样订阅

public class ViewModel : INotifyPropertyChanged
{
   private AxisVM axis;

   public ViewModel()
   {
      this.AxisVM = new AxisVM();
      this.AxisVM.LowerLimitChanged += OnLowerLimitChanged;
   }

   public AxisVM Axis
   {
     get { return axis}; 
     set { axis = value; FireOnPropertyChanged(); }
   }

   public double SomeDouble
   {
     get { return axis.Lowerlimit * 1.5 }; 
   }

   public void OnLowerLimitChanged(object sender, EventArgs e)
   {
      FireOnPropertyChanged("SomeDouble");
   }
}

您可以删除 属性 public AxisVM Axis 中的 FireOnPropertyChanged("SomeDouble"); 因为这只会在设置 AxisVM 实例时触发,而不是在该实例中设置 属性 时触发变了。

只需在您的视图模型中处理 AxisVMPropertyChanged

public class ViewModel : INotifyPropertyChanged
{
    private readonly AxisVM axis;

    public ViewModel()
    {
        axis = new AxisVM();
        axis.PropertyChanged += Axis_PropertyChanged;      
    }

    private void Axis_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        FireOnPropertyChanged(nameof(SomeDouble));
    }

    ...
}