公式 RX ブログに次の例があります。
var scheduler = new TestScheduler();
var xs = scheduler.CreateColdObservable(
OnNext(10, 42),
OnCompleted<int>(20)
);
var res = scheduler.Start(() => xs);
res.Messages.AssertEqual(
OnNext(210, 42), // Subscribed + 10
OnCompleted<int>(220) // Subscribed + 20
);
xs.Subscriptions.AssertEqual(
Subscribe(200, 1000) // [Subscribed, Disposed]
);
このようなことを reactui で行いたいと思います。つまり、scheduler.CreateColdObservable(...) の代わりに、実際のプロパティ変更通知からのストリームを使用します。問題は、私が vm.ObservableForProperty と vm.Changed を試してみたが、一貫して動作しなかったことです (すべてのプロパティ変更がイベントを作成したわけではないか、値が null でした)。
私のVMのコードは次のとおりです。
internal class ProductFileEditorVM : ReactiveObject
{
private readonly List<string> _preloadedList;
private bool _OnlyContainingProduct;
public bool OnlyContainingProduct
{
get { return _OnlyContainingProduct; }
set
{
this.RaiseAndSetIfChanged(x => x.OnlyContainingProduct, value);
}
}
private ObservableAsPropertyHelper<IEnumerable<string>> _RepoList;
public IEnumerable<string> RepoList
{
get{return _RepoList.Value;}
}
public ProductFileEditorVM(RepositoryManager repositoryManager)
{
//Set defaults
OnlyContainingProduct = true;
//Preload
_preloadedList = repositoryManager.GetList();
var list = this.WhenAny(x => x.OnlyContainingProduct,
ocp =>
ocp.Value
? _preloadedRepoList.Where(repo => repo.ToLower().Contains("product"))
: _preloadedRepoList);
list.ToProperty(this, x => x.RepoList);
}
}
理想的には、2 つのプロパティで Observable.CombineLatest を使用し、タプルを作成して、最初の例のように assert 式でこのタプルを比較したいと思います。
良い結果は次のようになります。
- [OnlyContainingProduct==true;RepoList= フィルタリングされたもの]
- !OnlyContainingProduct を false に変更
- [OnlyContainingProduct==false;RepoList= リスト全体]
*それとも、これはアプローチの仕方が間違っているのでしょうか? これについて私が見た唯一の例は、ミリ秒などの実際の時間測定を使用していますが、Throttle および同様の方法の場合を除いて、それらがどのように役立つかはわかりません。*