MVVM Light多数据上下文

时间:2013-03-26 13:05:49

标签: wpf xaml mvvm mvvm-light

我是MVMM Light工具包的新手(注意,我在.NET 3.5上使用Light)。到目前为止,我真的开始喜欢这种模式,除了两个挑战。

  • 我想在我的应用程序中为某些类型的页面提供可重用的XAML模板。想想电影票亭。中心的主要内容,但几乎总是在屏幕上的某个按钮取消或返回。我想拥有可重复使用的网格,当我创建一个新页面时,我基本上导入了这个网格布局,而不必担心常见的位,可以只关注我的部分。做一点研究我觉得<ContentPresenter>可能是去这里的方式,但它对我来说仍然是陌生的。

  • Assumign我在第一次挑战中取得了成功,我认为这些常见项目的数据上下文(比如一个Cancel按钮)将在除该页面的ViewModel之外的其他地方,以避免一堆重复码。这是采用单个控件并从XAML引用不同视图模型的最佳方法吗?有点像...

    <Button ... DataContext={Binding CommonStuffVM, Source={StaticResource Locator}} />

1 个答案:

答案 0 :(得分:1)

您可以使用TemplatesDataTemplates创建一个可重复使用的模板,用于定义对象的外观。

例如,

<DataTemplate DataType="{x:Type local:MovieTicket}">
    <!-- Write the XAML for your Movie Ticket -->
</DataTemplate>

您可以让DataTemplate x:Key专门在ItemTemplateContentTemplate中引用它,或将其保留,以便在WPF尝试绘制时随时使用一个MovieTicket对象

<ItemsControl ItemsSource="{Binding MovieTickets}" />

<ContentControl Content="{Binding SelectedMovieTicket}" />

对于你的第二个问题,我认为这对于个人控制来说是一个坏主意,尽管这是该计划完整部分的常见做法。

使用MVVM时,ViewModels是您的应用程序,而不是您的UI。

如果您的窗口应显示Movies的列表供用户编辑,并允许用户保存或取消其更改,那么您的ViewModel应包含ObservableCollection<Movie>并包含{{1} }和ICommand SaveCommand

您真的希望您的View仅反映您的ViewModel,而不是让它们从整个ViewModel层次结构中提取所需的数据。

根据您的问题,您可能会对我有关Navigation with MVVM的博客文章感兴趣,该文章使用的代码与您提出的问题非常相似。它显示了如何使用隐式ICommand CancelCommand更改UI,并包含一个完整的代码示例,您可以下载并查看该示例以更好地了解MVVM体系结构。