TemplateBinding DataContext в Silverlight CustomControl - PullRequest
0 голосов
/ 20 декабря 2011

У меня довольно интересный случай с элементом управления ComboBox - CustomComboBox;

В стиле этого ComboBox Popup содержит один пользовательский элемент управления, который запрашивает DataContext;

<ctrl:CustomGrid DataContext="{TemplateBinding DataContext}" GridName="{Binding Preferences.CurrentGridName}"/>

Идея:

  • чтобы использовать этот элемент управления несколько раз на одной странице
  • чтобы использовать его в контейнере главной страницы
  • элемент управления главной страницы должен иметь разные DataContexts относительно страницы, на которой он находится

Логика:

  • В переопределенном OnApplyTemplate я получаю сетку и подключаю несколько обработчиков событий

Проблема:

  • Элемент управления главной страницы вызывает OnApplyTemplate только один раз
  • Первое появление CustomComboBox, как и ожидалось. Тем не менее, каждый следующий внешний вид имеет один и тот же DataContext, даже при изменении текстового контекста CustomComboBox Эти изменения не доходят, чтобы изменить мой CustomGrid DataContext

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

Спасибо

1 Ответ

1 голос
/ 21 декабря 2011

OnApplyTemplate вызывается, когда ControlTemplate применяется к элементу управления, который переопределяет метод (ни его родительский, ни дочерний).Если OnApplyTemplate введено один раз, переопределение также должно быть создано один раз.Я имею в виду, у вас просто есть один экземпляр главной страницы .Это не должно быть неожиданным.

Говоря о Popup s и DataContext, часто возникают проблемы с привязками от Popup к нему.Таким образом, я бы предпочел написать некоторый код для предоставления правильного контекста Popup с, а не полагаться на Binding с.Конечно, существует проблема отсутствия события DataContextChanged до SL5.Чтобы обойти это, вы должны определить свой пользовательский DependencyProperty на вашем CustomComboBox, привязать его к контексту CustomComboBox и присвоить его значение Popup в PropertyChangedCallback.

...