当父级 属性 更改时,为派生属性触发 PropertyChanged
Fire PropertyChanged for derived properties when parent property changes
基本上,我有一张高度为 PX 和 MM(用于打印)的图像。作为 "derived" 属性,我有 µm / px 值:
public int HeightPX { get { return _HeightPX; } private set { _HeightPX = value; RaisePropertyChanged(); }
public int HeightMM { get { return _HeightMM; } set { _HeightMM = value; RaisePropertyChanged(); }
public double MUpPX { get {return HeightPX != 0 ? HeightMM * 1000 / HeightPX : 0; } }
所有这些都通过绑定显示在 WPF 文本框中。
Text="{Binding ImageThing.MUpPX, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
但是,当更改 HeightPX
或 HeightMM
时,显然 MUpPX
会更改,但不会触发 PropertyChanged
事件,因此不会在 GUI 中更新。
我怎样才能做到这一点?我能否以某种方式监听 MUpPX
中 Height
的 PropertyChanged
事件,然后触发相应的事件?
我想避免从 Height
触发事件,因为可能/将会有其他派生属性,如果我必须处理每个派生属性,这将不是一个非常干净的抽象 属性 在 "parent" 个中。
只要您想更新 UI,就应该调用 RaisePropertyChanged(nameof(MUpPX))
。
如果您不想在 Height*
属性的设置器中执行此操作,您可以在 RaisePropertyChanged
方法中执行此操作,例如:
public void RaisePropertyChanged([CallerMemberName]string caller = null)
{
if (PropertyChanged != null)
{
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(caller));
if (caller == nameof(HeightPX) || caller == nameof(HeightMM))
{
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(MUpPX)));
}
}
}
基本上,我有一张高度为 PX 和 MM(用于打印)的图像。作为 "derived" 属性,我有 µm / px 值:
public int HeightPX { get { return _HeightPX; } private set { _HeightPX = value; RaisePropertyChanged(); }
public int HeightMM { get { return _HeightMM; } set { _HeightMM = value; RaisePropertyChanged(); }
public double MUpPX { get {return HeightPX != 0 ? HeightMM * 1000 / HeightPX : 0; } }
所有这些都通过绑定显示在 WPF 文本框中。
Text="{Binding ImageThing.MUpPX, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
但是,当更改 HeightPX
或 HeightMM
时,显然 MUpPX
会更改,但不会触发 PropertyChanged
事件,因此不会在 GUI 中更新。
我怎样才能做到这一点?我能否以某种方式监听 MUpPX
中 Height
的 PropertyChanged
事件,然后触发相应的事件?
我想避免从 Height
触发事件,因为可能/将会有其他派生属性,如果我必须处理每个派生属性,这将不是一个非常干净的抽象 属性 在 "parent" 个中。
只要您想更新 UI,就应该调用 RaisePropertyChanged(nameof(MUpPX))
。
如果您不想在 Height*
属性的设置器中执行此操作,您可以在 RaisePropertyChanged
方法中执行此操作,例如:
public void RaisePropertyChanged([CallerMemberName]string caller = null)
{
if (PropertyChanged != null)
{
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(caller));
if (caller == nameof(HeightPX) || caller == nameof(HeightMM))
{
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(MUpPX)));
}
}
}