0

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

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

  • 假设我在第一个挑战中取得成功,我认为这些常见项目(例如Cancel按钮)的数据上下文将位于该页面的 ViewModel 之外的其他位置,以避免大量重复代码。那是采用单个控件并从 XAML 引用不同视图模型的最佳方法吗?就像是...

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

4

1 回答 1

1

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

例如,

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

你可以给你DataTemplate的 an以在orx:Key中专门引用它,或者将其省略,以便在 WPF 尝试绘制对象时使用它ItemTemplateContentTemplateMovieTicket

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

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

对于您的第二个问题,我认为这对于单个控件来说是个坏主意,尽管它是程序完整部分的常见做法。

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

如果您的窗口应该显示一个Movies供用户编辑的列表,并允许用户保存或取消他们的更改,那么您的 ViewModel 应该包含一个ObservableCollection<Movie>和包含一个ICommand SaveCommandICommand CancelCommand

你真的希望你的视图只反映你的视图模型,而不是让它们从整个视图模型层次结构中提取他们需要的数据。

根据您的问题,您可能对我的一篇关于使用 MVVM 导航的博客文章感兴趣,该文章使用的代码与您所询问的非常相似。它展示了如何使用隐式更改 UI DataTemplates,并包含一个完整的代码示例,您可以下载并查看以更好地了解 MVVM 架构。

于 2013-03-26T15:49:30.477 回答