Eu tenho um caso bastante interessante com o controle ComboBox - CustomComboBox;
No estilo deste ComboBox, Popup contém um controle personalizado que solicita um DataContext;
<ctrl:CustomGrid DataContext="{TemplateBinding DataContext}" GridName="{Binding Preferences.CurrentGridName}"/>
A ideia:
- usar este controle várias vezes em uma página
- para usá-lo em um contêiner de página-mestre
- o controle da página mestre precisa ter diferentes DataContexts em relação à página em que está
A lógica:
- No OnApplyTemplate substituído, estou obtendo a grade e conectando alguns manipuladores de eventos
O problema:
- O controle da página mestre está disparando OnApplyTemplate apenas uma vez
- A primeira aparência do CustomComboBox é comoesperado. No entanto, cada aparecimento seguinte é com o mesmo DataContext, mesmo ao alterar o datacontext do CustomComboBox Essas mudanças não chegam a mudar meu CustomGrid DataContext
Tenho certeza de que algo nas ligações ou na lógica de apresentação está ruim ... Por favor, jogue algumas idéias, gostaria de uma dica aqui
obrigado
Respostas:
1 para resposta № 1OnApplyTemplate
é chamado quando um ControlTemplate
é aplicado ao controle que substitui o método (nem seu pai, nem seus filhos). E se OnApplyTemplate
for inserido uma vez, o controle de substituição também deve ser criado uma vez. Quero dizer, você simplesmente tem um única instância de página-mestre. Isso não deve ser inesperado.
Falando sobre Popup
areia DataContext
, muitas vezes há problemas com ligações de um Popup
para fora dela. Então, eu preferiria escrever algum code-behind para fornecer o contexto correto para Popup
s, em vez de confiar em Binding
s. Com certeza há um problema de ausência de evento DataContextChanged antes de SL5. Para contornar este, você deve definir seu DependencyProperty
Nas suas CustomComboBox
, vincule-o ao CustomComboBox
"s contexto e atribuir seu valor ao Popup
no PropertyChangedCallback
.