gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:47:21 27 4
gpt4 key购买 nike

我有一种情况需要使用描述的技术 here解析绑定(bind)引用 RelativeSource 的绑定(bind)。我正在使用自定义标记扩展来允许我将实际的 Binding 对象分配给 DependencyProperty,但不幸的是,当我尝试在 中针对 Value 应用绑定(bind)时>DummyDO,它试图在等效标识为 DummyDORelativeSource 上找到我的路径(例如 Background),但它不会存在。

我希望我可以通过存储传递到 ProvideValueserviceProvider 属性并使用

来解决这个问题
return this.TargetBinding.ProvideValue((IProvideValueTarget)this.ServiceProvider);

稍后从标记扩展中获取,但这会导致一个非常奇怪的空引用异常,其中没有可访问的内容是空的(我的猜测是某些引用已以某种方式无效)。

另一种方法是在我的 ProvideValue 方法中存储属性的实际来源,然后创建一个新的 ProvideCurrentValue 方法,该方法根据 DummyDO 方法稍后。我只是不知道该怎么做!任何帮助将不胜感激。

代码如下:

XAML

<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>

(h:ResponsiveBrush 与我们所追求的无关——这是我要附加的行为,对此的关键部分是在某些时候它需要解析通过 PassBindingExtension 传递的 Binding 对象)

标记扩展

public class PassBindingExtension : MarkupExtension
{
public PassBindingExtension() { }
public PassBindingExtension(Binding targetBinding)
{
this.TargetBinding = targetBinding;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
var valueGetter = serviceProvider as IProvideValueTarget;
if (valueGetter != null)
{
// Get the object. NB that this will evaluate to a
// BUTTON given the XAML above NOT a StackPanel as I was hoping
this.TargetObject = valueGetter.TargetObject;
this.TargetProperty = valueGetter.TargetProperty;

/*
Ideally around here I need to evaluate the object to which
this. TargetBinding refers around here so I can get the correct
value later.
*/
}

/*
Addendum: If I try the following at this point, my application vanishes into
oblivion

var oOriginalValue = this.TargetBinding.ProvideValue(serviceProvider);

Not sure if that's intended or not, but since I don't need to get the
original value, I just need the info to work out where the future value
should come from, I'm not too fussed.
*/

return this;
}

public object ProvideValueLate()
{
object oOut = null;

/* Somehow, here, I need to reliably obtain
the value of TargetProperty on the
RelativeSource that would be evaluated with
respect to TargetObject
*/

return oOut;
}

[ConstructorArgument("targetBinding")]
public Binding TargetBinding { get; set; }

public object TargetObject { get; set; }

public object TargetProperty { get; set; }

// Obsolete - doesn't work
public IServiceProvider ServiceProvider { get; set; }

// Was hoping this would let me sidestep the issue, but lamentably it doesn't
public object ProvideValueLate_Old()
{ return this.TargetBinding.ProvideValue((IProvideValueTarget)this.ServiceProvider); }
}

最佳答案

是的,还不能精确地解决这个问题,但确实设法使用了一种解决方法,基于以下内容:

  • {Binding RelativeSource={RelativeSource Self}} 通过标准依赖属性对相关对象求值,其中 Self 可以是任何 RelativeSource。
  • 因此,在附加行为上创建两个属性,一个用于我们想要属性的对象,一个用于属性路径。称它们为 SourceObject 和 SourcePath。
  • 使用以下方法获取现有值。这是在 h:ResponsiveBrush 的事件处理程序中 - 我没有设法使用标记扩展来完成这项工作(这是我想要的,但不能全部......):

    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;

得到我需要的东西,但我暂时不会接受这个答案,因为它没有回答问题 - 只是为处于类似情况的其他人提供解决方法。如果有人确实知道为什么标记扩展方法不起作用,我仍然会非常感兴趣。

关于c# - 如何评估代码中的 RelativeSource 对象以提供有效的 Source 等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27568421/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com