当父级 属性 更改时,为派生属性触发 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}"

但是,当更改 HeightPXHeightMM 时,显然 MUpPX 会更改,但不会触发 PropertyChanged 事件,因此不会在 GUI 中更新。

我怎样才能做到这一点?我能否以某种方式监听 MUpPXHeightPropertyChanged 事件,然后触发相应的事件?

我想避免从 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)));
        }
    }
}