【问题标题】:Selecting user control based on type of DataContext根据 DataContext 的类型选择用户控件
【发布时间】:2011-12-29 23:56:48
【问题描述】:

我正在尝试在 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 中得到的是类型的名称。未使用数据模板。

有什么想法吗?

【问题讨论】:

  • 实际上,如果我使用

标签: wpf xaml


【解决方案1】:

您可以使用 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 可以让我在代码中选择模板。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
  • 2020-11-22
  • 2018-07-25
  • 1970-01-01
  • 2016-05-31
相关资源
最近更新 更多