根据DataContext的类型选择用户控件

Jef*_*ege 7 wpf xaml

我正在尝试在WPF中构建一组典型的CRUD维护表单 - 除了它们在不同的数据库记录上工作之外几乎相同.

我没有为每个创建一个新的窗口类,而是尝试使用单个窗口类,该窗口类使用不同的ViewModel类为每个数据库表实例化,并且我为每个ViewModel定义了不同的UserControl.

因此,如果我将其DataContext设置为Record1ViewModel实例的窗口实例化,我想使用Record1UserControl在窗口中显示它,如果它设置为Record2ViewModel的实例,我想使用Record2UserControl显示它.

我已经验证了两个用户控件都可以正常工作,只需在窗口的XAML中直接定义它们.但是我根本没有想出如何根据ViewModel的类型选择其中一个.

这不起作用:

<myWindow.Resources>

    <DataTemplate x:Key="{x:Type ViewModels:Record1ViewModel}">
        <MaintenanceControls:Record1 />
    </DataTemplate>
    <DataTemplate x:Key="{x:Type ViewModels:Record2ViewModel}">
        <MaintenanceControls:Record1 />
    </DataTemplate>

</myWindow.Resources>

<ContentPresenter Content="{Binding}" />
Run Code Online (Sandbox Code Playgroud)

我在ContentPresenter中得到的是该类型的名称.不使用DataTemplates.

有任何想法吗?

par*_*mar 4

您可以使用DataTemplateSelector在运行时动态选择DataTemplate类似以下内容的内容:

public class TaskListDataTemplateSelector : DataTemplateSelector
    {
        public override DataTemplate
            SelectTemplate(object item, DependencyObject container)
        {
            FrameworkElement element = container as FrameworkElement;

            if (element != null && item != null && item is Task)
            {
                Task taskitem = item as Task;

                if (taskitem.Priority == 1)
                    return
                        element.FindResource("importantTaskTemplate") as DataTemplate;
                else
                    return
                        element.FindResource("myTaskTemplate") as DataTemplate;
            }

            return null;
        }
    }
Run Code Online (Sandbox Code Playgroud)