2011-11-04 26 views
7

ReactiveUI benzeri görünüm modelim var. Bu NotifyPropertyChanged olayları ateş farklı türleri vardır ve herhangi bir yangın olduğunda çağrılacak bir yönteme abone olmak istiyorum, ancak gerçek değerlerle ilgilenmiyorum.Dönüş tipi önemsiz olduğunda gözlenebilirleri birleştirmenin daha zarif bir yolu var mı?

Geçerli kodum biraz çirkin (opak true seçimleri nedeniyle). Olay gerçekleştiğinde sadece bakmanın niyeti olduğunu gösteren, bunu ifade etmenin bir yolu var mı?

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

8 özelliği bir araya getiriyorum, bu yüzden gösterilenden daha çirkin.

cevap

16

bu ReactiveUI, benziyor yana nasıl WhenAny operatörü kullanma hakkında: gerçi Genelde

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

, eğer Keyfi Gözlemlenmeyenleri bir araya getiriyorlardı, ayrıca bunu uzantı yöntemini kullanarak biraz daha net bir şekilde yazabilirsiniz:

Bir ReactiveObject her özellik abone eğer

Ayrıca, sadece kullanmak için daha iyi olacaktır:

this.Changed.Subscribe(x => /* ... */); 
+0

gerçekten reaktif değil, gözlemlenebilir bir mülk benim ismimi ortadan kaldıran ve PropertyChanged eventpattern'den gözlemlenebilir olan bir uzantı yöntemidir. Ayrıca her bir mülke abone değil, sadece bazılarına. –

+0

Her neyse, her şeye rağmen, sözdiziminden anladığım kadarıyla, gerçek değerleri göz ardı etmiyor. –

+0

Zaber Zip gibi çalıştığı zaman, son parametre olarak bir seçici işlevi belirtirsiniz - bu durumda Birim seçiyoruz –

2

Sen niyet daha anlaşılır hale getirmek o bir uzantısı yöntemi yapabiliriz:

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

evet bunu yapabilir. Daha iyi bir alternatif yoksa muhtemelen bu şekilde yapar ya da bunun yerine ObservableForPropertyIgnoreValue yapar. Ancak bu durumda, çok iyi kullanmama niyetimizi iletmeyen bir değeri oluşturabiliriz, ki bu da çok güzel değil. Ancak, sanırım daha iyi bir yol olmamalı diye bir şey gözlemlemeliyiz? –

+9

[Birim] (http://msdn.microsoft.com/en-us/library/system.reactive.unit (v = vs.103) .aspx) türünde, dönüş değerinin hiçbir değerinin olmadığını bildirecek Bunun dışında, Scott'ın öneri yerine –

+0

+1 var, 'true' yerine 'Unit.Default' kullanın. –

İlgili konular