Выбор пользовательского элемента управления на основе типа DataContext - PullRequest
7 голосов
/ 30 декабря 2011

Я пытаюсь создать набор типичных форм обслуживания CRUD в WPF, которые будут примерно одинаковыми, за исключением того, что они будут работать с разными записями базы данных.

Вместо создания нового класса окнадля каждого я пытаюсь использовать один класс окна, экземпляр которого создается с другим классом ViewModel для каждой таблицы базы данных, и для которого у меня есть отдельный UserControl, определенный для каждого ViewModel.

Итак, если я создаю экземплярокно с его 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, это имя типа.Шаблоны данных не используются.

Есть идеи?

1 Ответ

4 голосов
/ 30 декабря 2011

Вы можете использовать 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;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...