Fire PropertyChanged для производных свойств при изменении родительского свойства - PullRequest
0 голосов
/ 12 февраля 2019

В основном у меня есть изображение с высотой в PX и в ММ (для печати).В качестве «производного» свойства у меня есть значение µ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 и, таким образом, не обновляется в графическом интерфейсе.

Как этого добиться?Могу ли я как-то прослушать PropertyChanged События Height в MUpPX и затем запустить соответствующее событие?

Я хотел бы избежать запуска события из Height, потому что может / будетдругие производные свойства, и это не будет очень чистой абстракцией, если я буду заботиться о каждом производном свойстве в «родительских» свойствах.

1 Ответ

0 голосов
/ 12 февраля 2019

Вам следует звонить 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)));
        }
    }
}
...