2011-04-01 71 views
6

想象一下,有一个View将显示数据收集的多个步骤。根据上一步的决定,以下步骤的顺序或特定实例将有所不同。MVVM ViewModel支持多个步骤:最佳实践?

以下MVVM纯粹主义最佳实践,我认为在外部ViewModel中有一个ViewModel的列表就是解决这个问题的方法,并让外部视图绑定一个自定义选项卡控件(或类似的)。

这使我对这个问题的两个方面,它们是我不清楚:

点一:“哪个先?”

外部View/ViewModel组合可能会是“View First”。也就是说,视图要么接收ViewModel,要么实例化一个。

但是,当涉及到这个外部ViewModel中ViewModel的列表:它们各自的视图来自哪里?哪个实体负责为每个实体选择最佳视图?

我并不都很喜欢像这样在“View First”和“ViewModel First”之间交替。

点二:的ViewModels

之间的通信当的内视图模型的步骤之一的完成,例如在点击“保存”或“下一步”按钮时,应该对该内部ViewModel发出命令,然后显示下一个命令。

这需要外视图模型到:

  1. 能够拿起发送到内视图模型

  2. 能够内视图模型内访问数据的保存命令。

通常情况下会如何呢?将内部和外部ViewModel与事件绑定在一起被认为是不好的做法吗?

+1

请看看[这里](http://stackoverflow.com/questions/5160829/how-do-i-design-a-复合视图和视图模型使用silverlight和mvvm),这个问题有一些相关的信息 – Snowbear 2011-04-01 08:55:36

+0

视图首先只有一个正确的方法,因为传递视图模型的视图违反了MVVM的原则。相应的视图在xaml中应用,如''。通信使用MvvmLight库中的Messenger类。 – vorrtex 2011-04-01 12:25:52

+0

我使用[DI库](http://en.wikipedia.org/wiki/Dependency_injection)并在其映射中选择视图和视图模型,将顶层“模块”代码中的内容绑定在一起。但我的应用程序从未如此复杂。这也不能解决你的子视图问题。像棱镜[区域功能](http://msdn.microsoft.com/en-us/library/microsoft.practices.prism.regions(v = pandp.40).aspx)可能有助于此。 – 2011-11-17 10:14:56

回答

6

1)在我的理解MVVM总是说ViewModels firstViews必然已经实例化ViewModels。对于所有内部/外部ViewModels。

他们各自的观点来自哪里?哪个实体负责为每个实体选择最佳视图?

在WPF中,我更喜欢使用DataTemplating。在app.xaml或某个其他应用程序范围的资源文件中,您可以定义特定于每个ViewModel的DataTemplates。在Views中,您将对ViewModel的绑定放入ContentPresenter,DataTemplating将View放在那里。示例:

的App.xaml

<Application.Resources> 
    <DataTemplate DataType="{x:Type local:OuterViewModel}"> 
     <local:OuterView /> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type local:InnerViewModel}"> 
     <local:InnerView /> 
    </DataTemplate> 
<Application.Resources> 

OuterView。XAML

<Grid> 
    <!-- Assuming OuterViewModel has a property named 'InnerViewModel' --> 
    <ContentPresenter Content="{Binding InnerViewModel}" /> 
</Grid> 

2)

能挑上送到内部视图模型

保存命令我把SaveCommandOuterViewModel

能够访问内部ViewModel中的数据。

我会每个内部视图模型的引用在OuterViewModel