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

标签 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}" />

我在 ContentPresenter 中得到的是类型的名称。不使用数据模板。

有任何想法吗?

最佳答案

您可以使用 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;
        }
    }

关于wpf - 根据 DataContext 的类型选择用户控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8674887/

相关文章:

wpf - Enum 的 DataStateBehavior 而不是 bool?字符串?

C# 如何从 calendar.SelectedDate 中以 dd/MM/yyyy 格式获取日期

WPF 绑定(bind)到样式中另一个属性的绑定(bind)

c# - 如何处理 UWP NavigationView 中设置按钮的点击事件?

c# - Xamarin Forms : System. Reflection.TargetInvocationException:调用目标抛出异常

c# - 按钮命令绑定(bind)不调用 Xamarin.Forms 中的绑定(bind)命令

c# - 无法分配给属性 'Windows.UI.Xaml.FrameworkElement.MinHeight'

c# - 如何在 WPF 中获取按键的 ascii dec 编号

c# - MVVM - 如何从父 ViewModel 引用子 ViewModel(ViewModel 在其 View 中创建)?

javascript - WPF 离屏 Web 浏览器控件 - 页面加载时的 Javascript 不起作用