Связывание WPF DataContext не происходит - PullRequest
0 голосов
/ 02 марта 2011

У меня есть пользовательский элемент управления, который динамически встраивает ряд других элементов управления на основе аналогичных шаблонов данных.

В моем элементе управления есть модель представления с привязываемыми свойствами как для DataContext размещенного субэлемента управления, так и для ContentTemplate.Тем не менее, когда я запускаю шаблон, он хорошо связывается и инициализируется, но DataContext никогда не поднимается, даже с событием DataContextChanged.

<ContentControl Name="SessionControl1" DataContext="{Binding SessionItem1}" ContentTemplate="{Binding Source={StaticResource ViewModel},Path=Session1Template}"  /> 

Теперь в качестве теста я взял один из переключаемых элементов управления, которые я хотел (AudioCard.xaml) и попытался использовать его в том же месте, например, так:

<local:AudioCard DataContext="{Binding SessionItem1}" />

Это прекрасно работает, элемент управления инициализируется так же, как в динамическом случае, и событие DataContextChanged запускается с правильной привязкой.Это заставляет меня думать, что привязка к DataContext в ContentControl не работает.

Два вопроса: 1) есть ли простой способ исправить это?

2) есть ли лучший способсделать это?

РЕДАКТИРОВАТЬ: Основываясь на первом ответе, я изменил код, чтобы выглядеть так:

<ContentControl Name="SessionControl1" Grid.Row="0" Grid.Column="0" ClipToBounds="False" Height="128" Width="128"
                                        DataContext="{Binding SessionItem1}"
                                        ContentTemplateSelector="{StaticResource ProximitySessionCardTemplateSelector}"  />

Я вижу, как код входит в мой контентшаблонный селектор, но мой объект в селекторе пуст.Должен ли я быть привязанным к чему-то другому?

Ответы [ 2 ]

2 голосов
/ 03 марта 2011

Хорошо, основываясь на совете Elad об использовании селектора шаблонов данных в XAML и с правильной привязкой к контенту вместо DataContext, этот код работает как нужно:

<ContentControl Name="SessionControl1" 
            Content="{Binding Source={StaticResource ViewModel},Path=SessionItem1}"                                        
            ContentTemplateSelector="{StaticResource ProximitySessionCardTemplateSelector}"  />
1 голос
/ 02 марта 2011

Что касается Q2:

Почему вы привязываетесь к ControlTemplate?

  1. Вы можете просто создать DataTemplate, который «ловит» определенный тип (свойство в ViewModel), и поэтому будет отображать шаблон, основанный на объекте, который вы помещаете внутрь автоматически, без необходимости также связывать ControlTemplate. .

  2. Если вы держите свойство ControlTemplate в своей ViewModel (и похоже, что вы это делаете), вы нарушили одно из самых важных правил MVVM - ViewModel не знает ничего о представлении, и не содержит ссылок на элементы управления или пользовательский интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...