Есть ли более элегантный способ объединить наблюдаемые, когда возвращаемый тип не важен? - PullRequest
7 голосов
/ 04 ноября 2011

У меня есть модель представления, подобная ReactiveUI.У него есть несколько свойств разных типов, которые запускают события NotifyPropertyChanged, и я хочу подписать метод, который будет вызываться при срабатывании любого из них, но я не заинтересован в фактических значениях.некрасиво (из-за непрозрачности true выбирает).Есть ли способ выразить это, что показывает намерение просто позаботиться о том, когда происходит событие?

    this.ObservableForProperty(m => m.PropertyOne)
        .Select(_ => true)
        .Merge(this.ObservableForProperty(m => m.PropertyTwo).Select(_ => true))
   .Subscribe(...)

Я объединяю около 8 свойств, так что это ужаснее, чем показано.

Ответы [ 2 ]

17 голосов
/ 05 ноября 2011

Так как это выглядит как ReactiveUI, как насчет использования оператора WhenAny:

this.WhenAny(x => x.PropertyOne, x => x.PropertyTwo, (p1, p2) => Unit.Default)
    .Subscribe(x => /* ... */);

В общем, если бы вы комбинировали произвольные Observables, вы могли бы также написать это немного более четко, используя не-расширениеМетод:

Observable.Merge(
    this.ObservableForProperty(x => x.PropertyOne).Select(_ => Unit.Default),
    this.ObservableForProperty(x => x.PropertyTwo).Select(_ => Unit.Default),
    this.ObservableForProperty(x => x.PropertyThree).Select(_ => Unit.Default)
).Subscribe(x => /* ... */);

Кроме того, если вы подписываетесь на каждое свойство ReactiveObject, вероятно, лучше просто использовать:

this.Changed.Subscribe(x => /* ... */);
2 голосов
/ 05 ноября 2011

Вы можете сделать это методом расширения, чтобы сделать намерение более понятным:

public static IObservable<bool> IgnoreValue<T>(this IObservable<T> source)
{
    return source.Select(_ => true);
}

...

this.ObservableForProperty(m => m.PropertyOne).IgnoreValue()
.Merge(this.ObservableForProperty(m => m.PropertyTwo).IgnoreValue())
.Subscribe(..);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...