gpt4 book ai didi

c# - 如何解析 MarkupExtension 中数据绑定(bind)的值?

转载 作者:太空狗 更新时间:2023-10-29 23:35:42 25 4
gpt4 key购买 nike

我制作了一个基于键翻译字符串的标记扩展。示例

<TextBlock Text="{Translate myKey}" />

现在我希望能够使用嵌套绑定(bind)来提供我的 key 。示例:

<TextBlock Text="{Translate {Binding KeyFromDataContext}}" />

当我这样做时,我得到一个 System.Windows.Data.Binding 对象。通过调用 ProvideValue 并向下传递 ServiceProvider,我可以获得 BindingExpression:

var binding = Key as Binding;
if (binding == null) {
return null;
}
var bindingExpression = binding.ProvideValue(_serviceProvider) as BindingExpression;
if (bindingExpression == null) {
return null;
}
var bindingKey = bindingExpression.DataItem;

我可以获得此 bindingExpression,但 DataItem 属性为空。我已经像这样测试了我的绑定(bind)

<TextBlock Text="{Binding KeyFromDataContext}" />

而且效果很好。

有什么想法吗?

最佳答案

toxvaerd's answer不是通用的。如果原始绑定(bind)已经有一个转换器,它就会中断。或者无法编写转换器。

有更好的解决方案。我们可以声明两个构造函数。第二个接受 BindingBase 将在使用绑定(bind)时由 XAML 调用。为了解析绑定(bind)的值,我们可以声明一个私有(private)附加属性。为此,我们需要知道标记扩展的目标元素。

有一个问题:当在模板中使用标记扩展时,没有目标元素(很明显)。在这种情况下,您是 supposedProvideValue() 中使用 return this - 这样在应用模板时将再次调用扩展。

public class TranslateExtension : MarkupExtension
{
private readonly BindingBase _binding;

public TranslateExtension(BindingBase binding)
{
_binding = binding;
}

public TranslateExtension(string key)
{
Key = key;
}

[ConstructorArgument("key")]
public string Key { get; set; }

public override object ProvideValue(IServiceProvider serviceProvider)
{
if (_binding != null)
{
var pvt = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
var target = pvt.TargetObject as DependencyObject;

// if we are inside a template, WPF will call us again when it is applied
if (target == null)
return this;

BindingOperations.SetBinding(target, ValueProperty, _binding);
Key = (string)target.GetValue(ValueProperty);
BindingOperations.ClearBinding(target, ValueProperty);
}

// now do the translation using Key
return ...;
}

private static readonly DependencyProperty ValueProperty =
DependencyProperty.RegisterAttached("Value", typeof(string), typeof(TranslateExtension));
}

关于c# - 如何解析 MarkupExtension 中数据绑定(bind)的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/985902/

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