の情報を特定の方法で取得する(この質問では重要ではありません)custom markup extensionがあります。カスタムMarkupExtensionでFreezableを処理する方法は?
視覚的または論理的なツリーの一部ではない要素でこのマークアップ拡張を使用するまでは、すべてうまくいきます。私の特定の例では、要素InputBindings
にあります。このシナリオでは、FrameworkElement
をDependencyObject
として取得する代わりに、Freezable
(KeyBinding
)を取得します。
コードでDataContext
にアクセスするにはどうすればよいですか?
私のXAMLコード:私は通常私のDataContext
取得私のカスタムマークアップ拡張機能で
<UserControl.InputBindings>
<KeyBinding
Key="CapsLock"
Command="{wtc:CommandBinding {x:Static b:Commands.OpenTimeLine}}" />
</UserControl.InputBindings>
コード:
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
これは難しいかもしれませんが、私はその物語のロジックが内部であることを知っています。 –