Как получить доступ к viewmodel динамически добавляемого UserControl

#c# #.net #wpf #xaml

#c# #.net #wpf #xaml

Вопрос:

Сценарий примерно такой: у меня есть MainWindow.xaml, где как часть этого окна я загружу UserControl. Этот UserControl фактически находится в каком-то другом проекте и добавляется в ResourceDictionary с ключом, как показано ниже,

 <ContentControl x:Key="Template1">
    <customcontrol:Template1UserControl/>
</ContentControl>
  

Итак, в MainWindow.xaml я буду ссылаться на этот ключ, как показано ниже,

 <ContentControl Content="{StaticResource Template1}"/>
  

Теперь, вот так, я могу видеть Template1UserControl в MainWindow.xaml, но проблема в том, что я не знаю, как получить доступ к datacontext Template1UserControl в MainWindow.xaml.

Template1 похож на переменную, завтра у него может быть Template2UserControl, который может быть любым.

Может кто-нибудь, пожалуйста, помочь мне сделать это в WPF. Если я должен применить здесь какую-то другую стратегию для доступа к viewmodel Template1UserControl, это также приветствуется.

Заранее спасибо!

Комментарии:

1. UserControl, завернутый в ContentControl, завернутый в еще один ContentControl? Выглядит странно. Вместо этого UserControl должен быть объявлен в DataTemplate. Вы должны назначить экземпляр типа модели представления свойству Content ContentControl, и соответствующий DataTemplate (с типом данных, который соответствует типу модели представления) будет выбран автоматически. Чтобы это работало, UserControl не должен устанавливать свой собственный DataContext, т. Е. Иметь модель частного представления.

2. К чему именно вы хотите получить доступ? Кстати, использование выглядит так, как будто вы создаете пользовательский элемент управления, для них не нужна модель представления, а скорее набор свойств зависимостей. ViewModel (MVVM) имеет смысл иметь, если что-то будет привязано к данным, а это наоборот: у вас скорее будет экземпляр view model под рукой.

Ответ №1:

Укажите ContentControl в MainWindow x:Name :

 <ContentControl x:Name="cc" Content="{StaticResource Template1}"/>
  

… и попробуйте применить свойства:

 var theTemplate = cc.Content as ContentControl;
var theUserControl = theTemplate?.Content as UserControl;
var theDataContext = theUserControl?.DataContext;