如何解决MarkupExtension中数据绑定的值?
我已经为基于键的字符串翻译做了标记扩展。 例
现在我希望能够使用嵌套绑定来提供我的密钥。 例:
当我这样做时,我得到一个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属性为null。 我已经像这样测试了我的绑定
它工作正常。
有任何想法吗?
toxvaerd的答案并不普遍。 如果原始绑定已经有转换器,它会中断。 或者在无法编写转换器时。
有一个更好的解决方案。 我们可以声明两个构造函数。 当使用绑定时,接受BindingBase
的第二个将由XAML调用。 要解析绑定的值,我们可以声明一个私有附加属性。 为此,我们需要知道标记扩展的目标元素。
有一个问题:当在模板中使用标记扩展时,没有目标元素(显然)。 在这种情况下,您应该在ProvideValue()
使用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)); }
无法获得绑定的值。 你不应该尝试这样做。 WPF使用一些花哨的reflection来解决绑定并相信我 – 你不要自己开始尝试。
无论如何,这是我最终做的,这实际上是一个很好的解决方案:
我制作了一个TranslateConverter
,负责翻译:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var key = value as string ?? parameter as string; if (key != null) { // Do translation based on the key } return null; }
然后在我的TranslateExtension
我只是这样做:
var binding = Key as Binding ?? new Binding{Mode = BindingMode.OneWay}; binding.Converter = new TranslateConverter(_targetObject, _targetProperty, Dictionary, Converter); binding.ConverterParameter = Key is Binding ? null : Key as string; return binding.ProvideValue(serviceProvider);
这样,绑定由WPF解析并作为值传递给转换器,而简单的文本键作为参数传递给转换器。
_targetObject
和_targetProperty
是从ServiceProvider获得的。
上述就是C#学习教程:如何解决MarkupExtension中数据绑定的值?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1269784.html