2

ReactiveUI と提供されたReactiveCollection<>クラスを使用しています。

ViewModel にはオブジェクトのコレクションがあり、それらのアイテムの IsValid プロパティを監視するオブザーバブルを作成したいと考えています。

これは私が解決しようとしているシナリオです。私のViewModelのコンストラクターで。

this.Items = new ReactiveCollection<object>();

IObservable<bool> someObservable = // ... how do I watch Items so when 
                                   // any items IsValid property changes, 
                                   // this observable changes. There
                                   // is an IValidItem interface.

this.TheCommand = new ReactiveCommand(someObservable);

...

interface IValidItem { bool IsValid { get; } }

編集アナの答えは、私をそこに連れて行ってくれました。解決策は次のとおりです。

this.Items = new ReactiveCollection<object>();
this.Items.ChangeTrackingEnabled = true;

var someObservable = this.Items.Changed
    .Select(_ => this.Items.All(i => i.IsValid));
4

2 に答える 2

5

IsValidの結果でをしたいかによります。完全に直感的ではありませんが、これが私がそれを行う方法です:

// Create a derived collection which are all the IsValid properties. We don't
// really care which ones are valid, rather that they're *all* valid
var isValidList = allOfTheItems.CreateDerivedCollection(x => x.IsValid);

// Whenever the collection changes in any way, check the array to see if all of
// the items are valid. We could probably do this more efficiently but it gets
// Tricky™
IObservable<bool> areAllItemsValid = isValidList.Changed.Select(_ => isValidList.All());

theCommand = new ReactiveCommand(areAllItemsValid);
于 2012-06-27T17:59:44.933 に答える
1

ReactiveUI を使用しているため、いくつかのオプションがあります。オブジェクトがReactiveValidatedObjects の場合、実際に ValidationObservable を使用できます。

var someObservable = this.Items
    .Select(o => o.ValidationObservable
        .Select(chg => chg.GetValue()) //grab just the current bool from the change
        .StartsWith(o.IsValid)) //prime all observables with current value
    .CombineLatest(values => values.All());

それらが ReactiveValidatedObjects ではなく、INotifyPropertyChanged を実装している場合は、最初の行を置き換えて、それらのオブジェクトに対して ReactiveUI で便利な ObservableForProperty 拡張メソッドを使用するだけです。代わりにo.ValidationObservableを使用しますo.ObservableForProperty(x => x.IsValid)。残りは同じはずです。

これは非常に一般的な使用例であり、拡張メソッドでラップしました。IEnumerable<ReactiveValidatedObject>

ポール・ベッツはもっとエレガントなものを持ってくると思いますが、これが私の仕事です。

于 2012-06-27T14:44:01.640 に答える