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

时间:2019-04-25 13:31:19

标签: c# wpf inotifypropertychanged

我是WPF初学者,但是PropertyChanged事件有问题:

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

我希望AxisVM的实例通知我的SomeDouble属性。 (无法使用转换器)

edit:我没有在此处包括完整的类,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属性,因为该属性在下限时会更新变化。

即使我访问了轴实例的属性,该轴实例的属性更改事件也不会触发(该事件确实会触发其事件,但不会通知我的SomeDouble属性)。

我现在很茫然,不胜感激。

3 个答案:

答案 0 :(得分:4)

只需处理视图模型中PropertyChanged的{​​{1}}:

AxisVM

答案 1 :(得分:1)

您可以为此使用事件。

在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");
   }
}

您可以删除属性FireOnPropertyChanged("SomeDouble");中的public AxisVM Axis,因为只有在设置AxisVM实例时才会触发此操作,而在此实例中的属性发生更改时才触发。

答案 2 :(得分:0)

在AxisVM中实现INotifyPropertyChanged时,您在此处添加了PropertyChanged事件。将其放入ViewModel中并解雇FireOnPropertyChanged()

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