#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;