【发布时间】:2012-08-22 16:23:41
【问题描述】:
我想在属性编辑器中实现一个从选定对象到属性条目的映射。例如在 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 的更改部分。
【问题讨论】:
标签: c# wpf user-interface f# system.reactive