试图通过微软的例子来理解MVVM

twe*_*ypi 2 c# mvvm windows-phone-8

看看这个例子:https://msdn.microsoft.com/en-us/library/windows/apps/gg521153%28v=vs.105%29.aspx?f=255&MSPPError=-2147217396

看起来ViewModel包含一组Models,它们被设置为视图的datacontext.

在MVVM中,ViewModel不应该是视图的datacontext,Model会修改ViewModel,然后会影响View吗?

Mic*_*kyD 5

TL; DR - 这个例子根本不是MVVM.

是的,它是MVVM的一个不好的例子.视图在运行时绑定到查询"viewmodel"中的属性而不是绑定到viewmodel本身的LINQ结果.在Accomplishments不使用其他任何地方.

换句话说, OP指向的示例中,视图根本不绑定到视图模型,而是错误地直接绑定到模型集合. 我不相信一个ObservableCollection<>构成合理的ViewModel.(或IEnumerable<>; IList<>或类似的)

这是视图代码隐藏中的违规行:

LevelViewOnPage.DataContext = from Accomplishment in vm.Accomplishments 
                              where Accomplishment.Type == "Level" 
                              select Accomplishment;
Run Code Online (Sandbox Code Playgroud)

通常,您将视图绑定DataContext到viewmodel.

其他问题

代码审查方面,它实际上非常可怕,有一些奇怪的设计和命名约定.

该视图通过以下方式调用视图模型:

vm.GetAccomplishments();
Run Code Online (Sandbox Code Playgroud)

...因为它是一个没有"得到"的东西void.Accomplishments如果您的订单错误,该方法会填写您必须阅读的属性,因此太糟糕了.