TemplateBinding DataContext в silverlight CustomControl - silverlight, потребителски контроли, datacontext, шаблониране

Имам доста интересен случай с контрола ComboBox - CustomComboBox;

В стила на тази ComboBox Popup съдържа един персонализиран контрол, който изисква DataContext;

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

Идеята:

  • да използвате този контрол няколко пъти на една страница
  • да я използвате в контейнер за главната страница
  • контролът на главната страница трябва да има различни DataContext по отношение на страницата, на която е включен

Логиката:

  • В подменената OnApplyTemplate получавам решетката и свързвам няколко събития

Проблемът:

  • Контролът на главната страница задейства OnApplyTemplate само веднъж
  • Първото появяване на CustomComboBox е катоочакван. Въпреки това, всеки следващ изглед е със същия DataContext, дори когато променяте текстовия контекст на CustomComboBox Тези промени не могат да доведат до промяна на моя DataGontext за CustomGrid

Сигурен съм, че нещо в обвързването или логиката на презентацията е лошо ... Моля, хвърлете някои мисли, бих се радвал да намеря тук

Благодаря

Отговори:

1 за отговор № 1

OnApplyTemplate се извиква, когато a ControlTemplate се прилага към контрола, който отменя метода (нито родител, нито деца). ако OnApplyTemplate се въвежда веднъж, контрола за преодоляване също трябва да се създаде веднъж. Искам да кажа, просто имате a единствен пример за главната страница, Това не бива да е неочаквано.

Говорейки за Popupпясък DataContext, често има проблеми с обвързването от a Popup извън него. Затова бих предпочел да напиша някакъв код, за да предоставя правилен контекст Popups, вместо да разчитате на Bindingс. Има сигурен проблем с липсата на събитие DataContextChanged преди SL5. За да заобиколите този въпрос, трябва да дефинирате своя персонализиран DependencyProperty на твоят CustomComboBox, свържете го към CustomComboBoxконтекста и присвояване на неговата стойност към Popup в PropertyChangedCallback.