我是MVMM Light工具包的新手(注意,我在.NET 3.5上使用Light)。到目前为止,我真的开始喜欢这种模式,除了两个挑战。
我想在我的应用程序中为某些类型的页面提供可重用的XAML模板。想想电影票亭。中心的主要内容,但几乎总是在屏幕上的某个按钮取消或返回。我想拥有可重复使用的网格,当我创建一个新页面时,我基本上导入了这个网格布局,而不必担心常见的位,可以只关注我的部分。做一点研究我觉得<ContentPresenter>
可能是去这里的方式,但它对我来说仍然是陌生的。
Assumign我在第一次挑战中取得了成功,我认为这些常见项目的数据上下文(比如一个Cancel
按钮)将在除该页面的ViewModel之外的其他地方,以避免一堆重复码。这是采用单个控件并从XAML引用不同视图模型的最佳方法吗?有点像...
<Button ... DataContext={Binding CommonStuffVM, Source={StaticResource Locator}} />
答案 0 :(得分:1)
您可以使用Templates
或DataTemplates
创建一个可重复使用的模板,用于定义对象的外观。
例如,
<DataTemplate DataType="{x:Type local:MovieTicket}">
<!-- Write the XAML for your Movie Ticket -->
</DataTemplate>
您可以让DataTemplate
x:Key
专门在ItemTemplate
或ContentTemplate
中引用它,或将其保留,以便在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体系结构。