我是MVVM的新手,所以我想弄清楚最好的方法是什么。我正在使用带有Caliburn Micro的WPF。
对于我想要操作的模型,我有两个不同的视图(每个视图都有它们的视图模型)。一个视图在树视图中显示模型,而另一个视图显示数据的表视图。
我的模型基本上类似于以下
public class Foo
{
public string Name {get;set;}
public string[] Categories {get;set;}
}
视图是可视化Foo集合的不同方式。表视图非常简单,但树视图将按其包含的类别对Foo进行分组。
因此,如果Foo的实例类似于
var fo = new Foo(){Name =“one”,Categories = new [] {“a”,“b”,“c”}};
然后树视图将是
一
| _ one
B'/ P>
| _ one
C
| _ one
关于如何根据MVVM的精神将模型连接到视图模型,我有两个问题。
从模型中为不同视图填充视图模型的最佳方法是什么?我在思考像是从视图模型中访问的单例FooManager
。或者使用校准SimpleContainer
更适合这个?
让我说我通过更改它的类别集合来操纵表格视图中的Foo。我如何将更改传播到树视图,因为这意味着Foo将出现在不同的树节点中? Foo需要实现PropertyChangedBase' and somehow bubble up the changes to the other ViewModel? Or would it be better for
FooManager to implement
PropertyChangedBase`。似乎后者会更合理。
TIA
答案 0 :(得分:0)
对于更改引用BindableCollection并显示在视图上的集合。
至于将数据带入视图,您可以通过DI / IoC的组合,通过相关ViewModel上的构造函数注入来完成。其中大部分是通过接口完成的,可以在您选择的SimpleContainer中选择SimpleContainer,如果您愿意,或者您选择的IOC / DI容器,可以使用任何容器进行扩展。使用Interfaces可以对视图模型进行模拟和单元测试。
通过实现作为PropertyChangedBase类对象的一部分的INotifyPropertyChange,通常通过您所拥有的内容来完成对视图的更改的冒泡。
可能会让人头疼的一件事就是基于ObservableCollection的集合并不一定会冒泡集合中底层项目属性的变化,这是SO上完全不同的主题