繁体   English   中英

WPF/MVVM 在运行时动态加载视图

[英]WPF/MVVM Load a View dynamically at runtime

我有一个简单的 WPF 应用程序,如下所示:

在此处输入图片说明

我还创建了 3 个不同的视图:

  • 细节类型1.xaml
  • 细节类型2.xaml
  • 细节类型3.xaml

每个视图都有自己的 ViewModel

父视图.xaml

...
<!-- Detail Area -->
<GroupBox x:Name="groupDetails" Grid.Column="0" Header="Details"
                      HorizontalAlignment="Stretch"
                      Grid.Row="0" VerticalAlignment="Stretch">
   <GroupBox.Resources>
        <ResourceDictionary>
             <DataTemplate DataType="{x:Type vm:DetailType1ViewModel}">
                  <views:DetailType1View/>
             </DataTemplate>
             <DataTemplate DataType="{x:Type vm:DetailType2ViewModel}">
                  <views:DetailType2View/>
             </DataTemplate>
        </ResourceDictionary>
   </GroupBox.Resources>
   <ContentPresenter DataContext="{Binding}" Content="{Binding Path=BaseTypeViewModel}" />
</GroupBox>
...

父视图模型.cs

...
public BaseViewModel BaseTypeViewModel
{
    get { return GetValue<BaseViewModel>(); }
    set
    {
        SetValue(value);
    }
}

private void ShowDetailDialog()
{
    var vm = GetViewModelByID(SelectedID);
    BaseTypeViewModel = vm;
}

private BaseViewModel GetViewModelByID(int Id)
{
    switch (Id)
    {
        case 1:
            return IoC.Get<DetailType1ViewModel>();
        case 2:
            return IoC.Get<DetailType2ViewModel>();
    }
}
...

DetailType1ViewModel.cs

public class DetailType1ViewModel : BaseViewModel
{
    ...
}

我的问题是:

每次双击左侧窗格中的 DataGrid 行时,我想根据所选 ID 将上述视图之一加载到详细信息区域。 那么可以使用哪些技术呢? 如果您能向我展示代码示例,那就太好了。

感谢大家的帮助。

  1. <ResourceDictionary>为要在详细信息区域中显示的每个 ViewModel 创建一个<DataTemplate> (使用正确的DataType={x:Type local:DetailTypeViewModelX} )。
  2. 确保此<ResourceDictionary>合并到详细信息区域的祖先中。 一个可能的位置是<Application.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="..." />
  3. 将详细信息区域的DataContext绑定到要显示的ViewModel 的实例。
  4. 在要显示步骤 1 中<DataTemplate>内容的详细信息区域中创建一个<ContentPresenter Content="{Binding}" />

这应该有效并遵循 MVVM 的整体概念。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM