我遇到的情况是我需要使用here描述的技术来解析绑定引用RelativeSource
的绑定。我正在使用自定义标记扩展来允许我将实际的Binding对象分配给DependencyProperty
,但不幸的是,当我尝试在Value
中对DummyDO
应用绑定时,它会尝试在等效标识的Background
到RelativeSource
上查找我的路径(例如DummyDO
),该路径不存在。
我希望通过存储传递到serviceProvider
的{{1}}属性并使用
ProvideValue
稍后从标记扩展开始,但这导致一个非常奇怪的空引用异常,其中没有任何可访问的是null(我的猜测是某些引用已经以某种方式失效)。
另一种方法是在我的return this.TargetBinding.ProvideValue((IProvideValueTarget)this.ServiceProvider);
方法中存储属性的实际来源,然后创建一个ProvideValue
的新方法,以便稍后根据ProvideCurrentValue
方法重新评估绑定。我只是无法解决如何做到这一点!任何帮助将不胜感激。
以下代码:
XAML
DummyDO
(h:ResponsiveBrush与我们正在追求的内容无关 - 这是我试图附加的行为,对此至关重要的部分是它需要解析它通过PassBindingExtension传递的Binding对象)
标记扩展程序
<StackPanel>
<Button
h:ResponsiveBrush.CentreTrackBrush="True"
h:ResponsiveBrush.Binding="{e:PassBinding TargetBinding={Binding Background,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type StackPanel}}}}"
>
<Button.Content>Try Me</Button.Content>
</Button>
</StackPanel>
答案 0 :(得分:0)
是的,避风港已经能够精确地解决这个问题,但确实设法使用了一种解决方法,基于以下内容:
{Binding RelativeSource={RelativeSource Self}}
通过标准依赖属性评估相关对象,其中Self可以是任何RelativeSource。使用以下方法获取现有值。这是在h的事件处理程序中:ResponsiveBrush - 我没有设法使用标记扩展(这是我喜欢的,但是不能全部......):< / p>
string sourcePath = ((DependencyObject)sender).GetValue(SourcePathProperty);
DependencyObject sourceObject = ((DependencyObject)sender).GetValue(SourceObjectProperty);
Binding b = new Binding(sourcePath) {Source = sourceObject};
RadialGradientBrush sourceBrush = DependencyInterpreter.EvalBinding(b) as RadialGradientBrush;
获取我需要的东西,但我暂时不接受这个答案,因为它没有回答这个问题 - 只是为类似情况下的其他人提供了一种解决方法。如果有人能够解答为什么标记扩展方法不起作用,我仍然非常感兴趣。