根据DataContext类型选择用户控件

8
我正在尝试在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}" />

在ContentPresenter中,我得到的是类型名称。DataTemplates没有被使用。
有任何想法吗?

1
实际上,如果我使用<DataTemplate DataType="...">,这个可以工作。 - Jeff Dege
谢谢!我实际上没有这一部分 <ContentPresenter Content="{Binding}" /> - Piotr Golacki
1个回答

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;
        }
    }

在xaml中使用DataTemplates似乎可以正常工作,只要我使用正确的属性,但是使用DataTemplateSelector似乎可以让我在代码中选择模板。 - Jeff Dege

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接