2011-11-04 8 views
7

ReactiveUI와 유사한 뷰 모델이 있습니다. 그것은 여러 유형의 여러 가지 속성을 가지고 있습니다. 실제로는 NotifyPropertyChanged 이벤트가 발생합니다. 해고 될 때 호출되는 메서드를 구독하고 싶지만 실제 값에는 관심이 없습니다.반환 형식이 중요하지 않은 경우 관찰 가능 항목을 병합하는 좀 더 우아한 방법이 있습니까?

현재 코드가 약간 불투명합니다 (불투명하기 때문에 true 선택). 사건이 발생할 때 돌보는 의도를 보여주는 이것을 표현할 수있는 방법이 있습니까?

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

약 8 개의 속성을 병합하기 때문에보기보다보기가 어렵습니다.

답변

16

이 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 => /* ... */); 
+0

실제로는 reactui, observableforproperty는 이름을 추출하고 PropertyChanged eventpattern에서 관찰 가능한 것을 반환하는 내 확장 메서드입니다. 또한 모든 속성에 가입하지 않고 일부 속성 만 구독합니다. –

+0

WhenAny는 멋지지만, 구문에서 알 수 있듯이 실제 값은 무시하지 않습니다. –

+0

Any는 Zip처럼 작동하며 마지막 매개 변수로 선택기 함수를 지정합니다.이 경우에는 Unit으로 선택합니다. –

2

당신이 의도를 명확하게하기 위해 그것을 확장 방법을 만들 수 :

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(..); 
+0

그래 그렇게 할 수 있습니다. 더 나은 대안이 없다면이 방법으로 할 수도 있고 ObservableForPropertyIgnoreValue를 대신 만들 수도 있습니다. 그러나이 경우에 우리는 값을 생성합니다.이 값은 잘 사용하지 않겠다는 의사를 전달하지 않습니다. 매우 아름답습니다. 그러나 나는 우리가 추측 한 어떤 것을 관찰해야만 더 좋은 방법이 없어야 만 하는가? –

+9

반환 값에 값이 없음을 알리는 [단위] (http://msdn.microsoft.com/en-us/library/system.reactive.unit (v = versus103) .aspx) 유형 그것이 존재하는 것 이외에 –

+0

'true'대신 Scott의 제안에 +1, 'Unit.Default'를 사용하십시오. –