Объединить свойства зависимостей

Я сделал несколько проектов WPF и вижу, что всплывает та же проблема, и это «проблема» агрегирования/объединения свойств зависимостей (dp).

Например, у меня есть 10 dp типа bool, которые я хочу объединить и представить как отдельный dp. Комбинированное значение dp истинно, если только одна или несколько его составляющих не являются ложными.

В настоящее время я делаю это с помощью addValueChanged, который регистрирует обратный вызов для каждого из 10 (!() dp, но мне интересно, есть ли более элегантные решения или, возможно, фреймворк, который решает этот распространенный сценарий. Я еще не использовал reactiveUI и mvvm light. но я думаю, что это может быть полезно здесь.

        var dpd = DependencyPropertyDescriptor.FromProperty(property,
                                                            owner.GetType());
        dpd.AddValueChanged(owner,
                            handler);

person buckley    schedule 07.01.2013    source источник


Ответы (3)


В ReactiveUI это:

// etc all the way to ten
this.WhenAny(x => x.PropOne, x => PropTwo, x => x.PropThree, 
    (one,two,three) => one && two && three)
    .Subscribe(x => FinalProp = x);
person Ana Betts    schedule 08.01.2013

DependencyProperties работают на основе обычного свойства.

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

Геттер для комбинированного свойства bool должен оценивать свойства root bool.

person JoanComasFdz    schedule 07.01.2013

Не уверен, что это более элегантно, но для каждой отдельной опорной стойки (1...10) у вас есть сеттер.

Внутри каждого Set вы можете вызвать (с синтаксисом Caliburn Micro)

OnPropertyChanged(() => depPropN);      // where N = 1 ..... 10
OnPropertyChanged(() => combinedDepProp);
person Klaus78    schedule 07.01.2013
comment
Вы также можете переопределить CM OnNotifyPropertyChanged для объекта и проверить имя свойства для меняющегося реквизита, если определенное свойство меняется, вы можете создать уведомление об изменении свойства для связанных реквизитов. Я считаю, что это выглядит немного менее грязно для моего кода получения/установки свойства - person Charleh; 07.01.2013