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

时间:2016-10-12 10:47:38

标签: c# wpf xaml mvvm

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

enter image description here

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

  • DetailType1.xaml
  • DetailType2.xaml
  • DetailType3.xaml

并且每个视图都有自己的ViewModel

ParentView.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>
...

ParentViewModel.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行时,我想将上述视图中的一个加载到Details区域,具体取决于所选的ID。那么可以使用哪些技术?如果你能给我看一个代码示例,那就太好了。

感谢所有人的帮助。

1 个答案:

答案 0 :(得分:2)

  1. 为要在详细信息区域中显示的每个ViewModel在<DataTemplate>内创建<ResourceDictionary>(使用正确的DataType={x:Type local:DetailTypeViewModelX})。
  2. 确保将此<ResourceDictionary>合并到详细信息区域的祖先中。可能的地方是<Application.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="..." />
  3. 将详细信息区域的DataContext绑定到要显示的ViewModel实例。
  4. 在详细信息区域中创建<ContentPresenter Content="{Binding}" />,以便在步骤1中显示<DataTemplate>的内容。
  5. 这应该有效并遵循MVVM的整体概念。