プロパティ エディタで、選択したオブジェクトからプロパティ エントリへのマップを実装したいと考えています。たとえば、Visual Studio xaml エディターのように。
ターゲット マップは次のようなものです (または、ReactiveUI の ReactiveCollection を使用しているのでしょうか?)
Selected objects Filled categories to display in PropertyEditor
------------------------- ---------------------------------------
ObservableCollection<obj> -> ObservableCollection<Category>
平易な英語の地図:
- オブジェクトからすべての一意のプロパティ タイプを収集する
- カテゴリ別にグループ化 (例: テキスト、レイアウト)
- 選択したオブジェクトを反映するために、必要に応じてカテゴリを追加/削除します
- 必要に応じて、既存のカテゴリからプロパティを追加/削除します
課題は、ブランチを追加/削除せずに宣言的/機能的なコードを持つことです。(私はすでに、非常に醜くエラーが発生しやすい命令/イベントベースのコードを持っています。)
Category コレクションと Property コレクションは通常の演算 (Union、Substract、IsMember) を持つセットであると想定できると思います。
インスピレーションは、単純な 1 対 1 マップに最適な、Paul Betts によるReactiveUIのコードです。
var Models = new ReactiveCollection<ModelClass>();
var ViewModels = Models.CreateDerivedCollection(x => new ViewModelForModelClass(x));
// Now, adding / removing Models means we
// automatically have a corresponding ViewModel
Models.Add(new Model(”Hello!”));
ViewModels.Count();
>>> 1
Seq と F# を使用すると、単純な観測不可能なマップは次のようになります。
selectedObjects
|> Seq.collect GetProperties |> Seq.unique |> Seq.groupBy GetPropertyCategory
|> Seq.map (fun categoryName properies -> CreateCategory(properties))
上記のコードは理論上は問題ありませんが、実際には、選択したオブジェクトが変更されるたびに、すべてのビュー モデルが最初から再作成されます。Rex で達成したいことは、上記のマップのバージョンにインクリメンタル アップデートを適用することです。これにより、WPF は GUI の変更された部分のみを更新します。