如何在代码中评估RelativeSource对象以提供有效的Source等效项

时间:2014-12-19 14:49:56

标签: c# wpf binding

我遇到的情况是我需要使用here描述的技术来解析绑定引用RelativeSource的绑定。我正在使用自定义标记扩展来允许我将实际的Binding对象分配给DependencyProperty,但不幸的是,当我尝试在Value中对DummyDO应用绑定时,它会尝试在等效标识的BackgroundRelativeSource上查找我的路径(例如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>

1 个答案:

答案 0 :(得分:0)

是的,避风港已经能够精确地解决这个问题,但确实设法使用了一种解决方法,基于以下内容:

  • {Binding RelativeSource={RelativeSource Self}}通过标准依赖属性评估相关对象,其中Self可以是任何RelativeSource。
  • 因此,在附加行为上创建两个属性,一个用于我们想要属性的对象,另一个用于属性路径。称它们为SourceObject和SourcePath。
  • 使用以下方法获取现有值。这是在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;
    

获取我需要的东西,但我暂时不接受这个答案,因为它没有回答这个问题 - 只是为类似情况下的其他人提供了一种解决方法。如果有人能够解答为什么标记扩展方法不起作用,我仍然非常感兴趣。