2011-12-29 3 views
7

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

Вместо того, чтобы создавать новый класс окна для каждого, я пытаюсь использовать один класс окна, который создается с помощью другого класса 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, это имя типа. DataTemplates не используются.

Любые идеи?

+0

На самом деле, это работает, если я использую

ответ

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

Использование DataTemplates в xaml, похоже, работает, как только я использую правильные атрибуты, но похоже, что использование DataTemplateSelector позволило бы мне выбрать шаблон в коде. –

Смежные вопросы