У меня есть рабочее пользовательское расширение разметки , которое извлекает информацию из DataContext
особым образом (неважно для этого вопроса).
Все хорошо, пока я не используюэто расширение разметки в элементах, которые не являются частью визуального или логического дерева.В моем конкретном примере в элементе InputBindings
.В этом сценарии вместо получения FrameworkElement
как DependencyObject
я получаю Freezable
(KeyBinding
).
Как получить доступ к DataContext
черезкод?
Мой код XAML:
<UserControl.InputBindings>
<KeyBinding
Key="CapsLock"
Command="{wtc:CommandBinding {x:Static b:Commands.OpenTimeLine}}" />
</UserControl.InputBindings>
Код в моем пользовательском расширении разметки, где я обычно получаю DataContext
:
protected override object ProvideValue(
DependencyObject dependencyObject,
DependencyProperty dependencyProperty )
{
if ( dependencyObject is Freezable )
{
// TODO: How to handle freezable?
}
_frameworkElement = dependencyObject as FrameworkElement;
if ( _frameworkElement == null )
{
throw new InvalidImplementationException(
"The DataContextBinding may only be used on framework elements." );
}
if ( !_dataContextChangedHooked )
{
_frameworkElement.DataContextChanged += DataContextChanged;
_dataContextChangedHooked = true;
}
return ProvideValue( _frameworkElement.DataContext );
}
Весь исходный код также онлайн.У меня довольно обширная иерархия классов для расширений разметки.
AbstractMarkupExtension ⇐ AbstractDependencyPropertyBindingExtension ⇐ AbstractDataContextBindingExtension ⇐ CommandBindingExtension