【发布时间】:2019-04-25 13:31:18
【问题描述】:
我是 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 属性)。
我现在不知所措,感谢任何帮助。
【问题讨论】:
-
您可以为此使用事件。或者将两个 Ui 元素绑定到 LowerLimit 并使用转换器(仅当 SomeDouble 仅用于在 UI 中显示时)。
-
经常有父子关系。如果父母需要了解孩子,那么通常父母会订阅孩子事件。公共
Axissetter 是个问题,您必须从那里取消订阅以前的孩子并订阅新的(或者您可能会出现内存泄漏)。父母也可能不得不在某个地方取消订阅。你真的需要publicsetter 吗? -
为什么somedouble不在axisvm或viewmodel中的下限?视图模型的目的是使数据和流程适应视图。将这些属性放在单独的视图模型中似乎只会让事情变得更难。
-
因此,您无需将相关属性放在一个或另一个 vm 中,而是创建一个依赖项。一个虚拟机需要知道另一个虚拟机的属性。这是你应该避免的。
标签: c# wpf inotifypropertychanged