2010-08-19 3 views
2

У меня есть мастер классов, который создает мастер со страницами, определенными в одном проекте. Модуль PageViewModel отделен от PageView. PageViewModel - обычный класс C#, полученный из абстрактного класса PageViewModelBase, а PageView - UserControl. Для того, чтобы определить соответствие между PageViewModel и просмотров страниц я написал следующий код для каждой страницы в моем проекте:Как добавить DataTemplate в ресурсы?

<Window.Resources> 
    <DataTemplate DataType="{x:Type OurNewPageViewModel}"> 
     <OurNewPageView /> 
    </DataTemplate> 
    </Window.Resources> 

Теперь я хочу, чтобы добавлять страницы в мастере, когда код доступа пользователей вызывает конструктор моего мастера. Это означает, что вы перемещаете View Pages и ViewModel на пользовательскую сторону. Например, чтобы создать мастер с одной страницей, пользователь напишет следующий код: Wizard usersWizard = новый мастер (новые пользователиViewModel(), новый пользовательский вид()); Проблема в том, что я не знаю, как обеспечить отображение между viewModel и View в моем конструкторе. Насколько я понимаю, я могу использовать два разных подхода к решению этой проблемы. Во-первых, использовать FrameworkElementFactory но следующий код не работает:

 //let we have WelcomePageView wpview and WelcomePageViewModel wpviewmodel 

     FrameworkElementFactory fef = new FrameworkElementFactory(wpview.GetType()); 
     DataTemplate dt = new DataTemplate(); 
     dt.DataType = wpview.GetType(); 

     dt.VisualTree = fef; 

     base.Resources.Add(wpviewmodel.GetType(), dt); 

Во-вторых, использовать XamlReader. Я могу создать шаблон данных, используя его, но я не знаю, как присоединить его к ресурсам.

ответ

3

В коде-за, чтобы создать DataTemplate, есть несколько ошибок:

  1. "dt.DataType = wpfView.GetType()" должен быть «dt.DataType = wpfviewmodel .GetType() "
  2. Вы должны использовать DataTemplateKey при добавлении шаблона в ResourceDictionary.

Так что ваш код должен быть что-то вроде:

DataTemplate dt = new DataTemplate(); 
dt.DataType = typeof(PageViewModel); 
FrameworkElementFactory fef = new FrameworkElementFactory(typeof(PageView)); 
dt.VisualTree = fef; 
DataTemplateKey dtKey = new DataTemplateKey(typeof(PageViewModel)); 
this.Resources.Add(dtKey, dt); 
+0

Очень хорошо! Это супер-старт, чтобы познакомиться с ioc, с собственным загрузчиком и так далее ... Спасибо :-) – peter70

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