如何通知对象实例之外的属性?
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 实例时触发,而不是在该实例中设置 属性 时触发变了。
只需在您的视图模型中处理 AxisVM
的 PropertyChanged
:
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));
}
...
}
我是 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 实例时触发,而不是在该实例中设置 属性 时触发变了。
只需在您的视图模型中处理 AxisVM
的 PropertyChanged
:
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));
}
...
}