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

c# - WPF/MVVM在运行时动态加载 View-LMLPHP

我还创建了3种不同的 View :

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

  • 每个 View 都有自己的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
    {
        ...
    }
    

    我的问题是:

    每次我在左 Pane 中双击DataGrid的行时,我都希望根据所选ID将上述 View 之一加载到“详细信息”区域中。那么可以使用哪些技术呢?如果您可以向我展示代码示例,那就太好了。

    感谢所有人的帮助。

    最佳答案

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

  • 这应该起作用并遵循MVVM的总体概念。

    关于c# - WPF/MVVM在运行时动态加载 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39996682/

    10-10 16:45