ReactivePropertyからReadOnlyReactiveCollectionの生成をしたいのですが
以下のコードで試したのですが、CombineLatestからの戻り値はIObservable<ReactiveCollection<string>>になるようです。
ReadOnlyReactiveCollection<string>にするにはどうすれば良いでしょうか?
C#
1public ReactivePropertySlim<string> FirstName { get; set; } 2 3public ReactivePropertySlim<string> LastName { get; set; } 4 5public ReadOnlyReactiveCollection<string> Messages { get; private set; } 6 7Messages = FirstName.CombineLatest(LastName, 8 (f, l) => new ReactiveCollection<string> 9 { 10 $"{nameof(FirstName)}: {f}", 11 $"{nameof(LastName)}: {l}" 12 });
FirstName.CombineLatest(...).ToReadOnlyReactiveCollection() ではできませんか?
https://blog.okazuki.jp/entry/2014/05/07/014133
> IObservable<CollectionChanged<T>>か、シンプルにIObservable<T>から生成する方法があります。
私も、.ToReadOnlyReactiveCollection()をおこなえば良いのかなと思ったのですが、できませんでした。
CombineLatestは、IObservable<T>を生成するメソッドなのでTをコレクションにしてしまうと余計ややこしくなってしまうようですね。
いや、そうなるのは CombineLatest のせいではなく、質問のコードのように new ReactiveCollection<string> しているからですね。現にベストアンサーの to4kichi さんの二番目のコードでも CombineLatest が使われています。
コメントがわかりずらかったようで申し訳ありません。
おっしゃるとおり「new ReactiveCollection<string>」のところが、そもそもCombineLatestの使い方として適切ではないのだと思います。
私のコメントの意図としては、CombineLatestは、IObservable<T>を生成するメソッドなのでTをコレクション(new ReactiveCollection<string>)にしてしまうと余計ややこしくなってしまう。という意味で書かせてもらいました。
to4kichi さんの二番目のコードのようにTがコレクションでない場合は、CombineLatestではIObservable<string>が生成されるだけですので全く問題ないですね。
ReactivePropertyで一般的に使用されているCombineLatestの使い方と思います。
ただし合成になってしまうので今回希望している用途としては使用できませんが。
(.ToReadOnlyReactiveCollection()しても、要素数が2のコレクションにはなるわけではないので)
回答1件
あなたの回答
tips
プレビュー