【问题标题】:Dynamically bind Views into a ContainerControl with MVVM使用 MVVM 将视图动态绑定到 ContainerControl
【发布时间】:2011-09-30 13:04:07
【问题描述】:

我一直在使用 Josh Smith's article 学习 MVVM 模式,我想创建一个带有右侧链接的经典布局(通过命令管理),因此当我单击一个时,我可以在选项卡的右侧显示我的视图控件(里面有一个 ContentControl)。

当我将 DataTemplate 与我想在屏幕上显示的特定 View 和 ViewModel 一起使用时,这很简单。

<!-- this section into my MainWindow's resources file -->
<DataTemplate xmlns:vm='clr-namespace:WpfFramework.ViewModels'
              xmlns:vw='clr-namespace:WpfFramework.Views'
              DataType="{x:Type vm:MySpecificViewModel }" >        
    <vw:MySpecificView />
</DataTemplate>

但是,我想要更通用的东西。我的意思是我的 mainWindow 不应该知道特定的 View 或特定的 ViewModel。它应该只知道它绑定到某些命令并具有显示“某些视图”的选项卡控件。包括Josh Smith's article 在内的每个样本似乎都具有有限的视图和视图模型,这对样本来说很棒。

那么,我怎样才能告诉我的 ContentControl 某些视图(及其对应的 viewModel)会在那里而不是那么具体(没有“刻录”到 mainView 中的具体类型)?

最好的问候 罗德里戈

PD。我尝试过使用基本 ViewModel 和基本视图,但它似乎不起作用。

【问题讨论】:

    标签: wpf mvvm binding


    【解决方案1】:

    在您的主视图中,将ContentControl 绑定到通用ViewModelBase 属性

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

    CurrentPage 将在主 ViewModel 中定义为 ViewModelBase 对象,并且要切换页面,您只需将 CurrentPage 设置为您想要的任何内容。

    因此,当您单击 HomePageCommand 之类的内容时,主 ViewModel 将执行 CurrentPage = new HomePageViewModel();,前提是 HomePageViewModel 继承自 ViewModelBase

    我不久前写了一些示例here,如果您有兴趣

    【讨论】:

    • 嗨,Rachel,感谢您的建议(顺便问一下,您能更正您的链接吗?)。我已经尝试过了,但我不知道如何将 HomePageViewModel 与其对应的 HomePageView 关联起来?
    • @Rodrigo 您在问题中做得正确。在您的应用程序资源中,定义将每个 ViewModel 映射到指定 View 的数据模板。通常我将映射放在&lt;Application.Resources&gt; 下的 App.xaml 中。另一种选择是将 DataTemplates 放在 ResourceDictionary 中,并在运行时将 ResourceDictionaries 加载到应用程序的 MergedDictionaries 中。如果 ResourceDictionaries 是动态加载的,或者它们存在于其他 dll 中,我会使用此方法。 (我也修复了链接)
    • 我有一个关于your example 的问题。是否涉及视图?我的意思是,如果我有 300 个视图,我应该在我的 mainView 上显式显示该标记吗?
    • 真的!!!??所以,我的公司项目中将有 300 个数据模板。好的,我正在同化...
    • @Rodrigo 是的,如果您的视图有 300 个 ViewModel 和 300 个 UserControl,则需要 300 个 DataTemplates 才能将它们两者映射在一起。不过不要忘记,视图不必是 UserControl - 它也可以只是 DataTemplate。通常,如果 ViewModel 很小,我会在需要的地方简单地将 View 编写为 DataTemplate。例如,采用具有地址、电话和电子邮件的客户对象。我将为我的 Customer 对象创建一个 UserControl 视图,但在 UserControl.Resources 中,我会将地址/电话/电子邮件视图定义为 DataTemplates。
    猜你喜欢
    • 2011-08-25
    • 2017-06-05
    • 2016-08-15
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    相关资源
    最近更新 更多