我想在属性编辑器中实现从选定对象到属性条目的映射。例如,在 Visual Studio xaml 编辑器中。
目标地图是这样的(或者可能使用 ReactiveUI 中的 ReactiveCollection?)
Selected objects Filled categories to display in PropertyEditor
------------------------- ---------------------------------------
ObservableCollection<obj> -> ObservableCollection<Category>
简单的英文地图:
- 从对象中收集所有独特的属性类型
- 按类别分组(例如文本、布局)
- 根据需要添加/删除类别以反映所选对象
- 根据需要从现有类别中添加/删除属性
挑战在于没有添加/删除分支的声明性/功能性代码。(我确实已经有一个基于命令/事件的代码,它非常丑陋且容易出错。)
我认为我们可以假设 Category 和 Property 集合是具有通常操作的集合:Union、Substract 和 IsMember。
灵感来自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 的更改部分。