当父属性更改时,为派生属性触发PropertyChanged

时间:2019-02-12 14:04:44

标签: c# wpf data-binding inotifypropertychanged

基本上,我的图像的高度分别为PX和MM(用于打印)。作为“派生”属性,我具有µ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中进行更新。

我该如何实现?我能以某种方式监听PropertyChangedHeight的{​​{1}}事件,然后触发相应的事件吗?

我想避免触发MUpPX中的事件,因为可能/将存在其他派生属性,并且如果我必须照顾“父级”中的每个派生属性,那将不是一个很干净的抽象。 “。

1 个答案:

答案 0 :(得分:1)

无论何时要更新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)));
        }
    }
}