我有一个正确的barney让我了解如何使用MVVM模式将所有内容组合在一起.这一切在实践中看起来都很简单但是试图实现它我似乎打破了我尝试编写的各种其他规则.
正如旁注,我正在尝试使用Flex实现模式,而不是Silverlight或WPF,所以如果任何人都有充分理由说明为什么不应该这样做,那么我想听听它们.
我有一个问题,我有几个观点.有时我必须同时在页面上显示两个视图; 有时候我会切换回一个视图.在我正常的Flex大脑中,我会有一个带有代码隐藏的主视图,其中包含我的所有其他视图(同样具有代码隐藏).然后,该主视图将切换其他单个视图.
当我尝试在MVVM实现这个我想坚持MVVM原则通过使用绑定其解耦我Views
从ViewModels
.假设我ViewModel
为应用程序范围创建了一个状态,并且我ApplicationView
对该数据进行了绑定,并完成了所有子视图的切换.
现在,我应该在哪里为子视图创建视图模型?我在里面试过ApplicationView
- 这似乎不对.然后我在应用程序视图之外尝试并将它的实例传递到ApplicationView
然后我的子模型中绑定到它.我错过了什么吗?这些方法似乎都不适合试图解耦这一点.
任何解释这个问题的好书或链接都将非常感激.
干杯,詹姆斯
您指的方法是ViewModel组合.它有多个复杂的视图部分需要绑定到自己的ViewModel实体.该方法需要构建具有每个子ViewModel属性的根ViewModel.然后根视图绑定到根视图模型,并且每个视图(无论是显示还是折叠)都绑定到根ViewModel上的相应属性.
ViewModel看起来像这样:
public class RootViewModel { ChildViewModelA ChildA { get; set; } ChildViewModelB ChildB { get; set; } }
视图看起来像这样:
您也可以在此处实现此功能,以允许您自己选择活动工作区.
ViewModel看起来像这样:
public class RootViewModel { public ListChildWorkspaces { get; set; } public ViewModel ActiveWorkspace { get; set; } public RootViewModel() { ChildWorkspaces.Add(ChildViewModelA); ChildWorkspaces.Add(ChildViewModelB); } }
视图看起来像这样:
这将导致基于ActiveWorkspace中存储的实际对象的类型选择适当的可视化表示.
原谅我的回复是在WPF.我尽力避免陷入其中的语法:-)
正如您所看到的,多个"ViewModel"可能含糊不清.通常我们发现需要构造多个子实体来适当地构造ViewModel.但是所有ViewModel实体都将位于根View Model对象中.
在WPF中实现MVVM时,我更倾向于推断隐式应用数据上下文的可视元素(如此响应的后半部分所示).在更复杂的场景中,我更喜欢使用DataTemplateSelector来执行该决策.但是在超级简单的情况下,您可以在C#/ ActionScript中以命令方式显式地应用DataContext,或者通过绑定以声明方式显式应用DataContext.
希望这可以帮助!