我是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
属性,因为该属性在下限时会更新变化。
即使我访问了轴实例的属性,该轴实例的属性更改事件也不会触发(该事件确实会触发其事件,但不会通知我的SomeDouble
属性)。
我现在很茫然,不胜感激。
答案 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
}