如何解决MarkupExtension中数据绑定的值?我为基于键的字符串翻译做了一个标记扩展。示例现在我希望能够使用嵌套绑定来提供我的密钥。示例:当我这样做时,我得到一个System.Windows.Data.Binding对象。通过调用ProvideValue并传递ServiceProvider,我可以获得一个BindingExpression:varbinding=KeyasBinding;如果(绑定==null){返回null;}varbindingExpression=binding.ProvideValue(_serviceProvider)asBindingExpression;if(bindingExpression==null){返回null;}varbindingKey=bindingExpression.DataItem;我可以获得此bindingExpression,但DataItem属性为空。我已经像这样测试了我的绑定并且它工作正常。有任何想法吗?toxvaerd的回答并不普遍。如果原始绑定已经有一个转换器,它就会中断。或者当无法写入转换器时。有一个更好的解决方案。我们可以声明两个构造函数。使用绑定时,接受BindingBase的第二个将由XAML调用。为了解析绑定值,我们可以声明一个私有附加属性。为此,我们需要知道标记扩展的目标元素。存在一个问题:在模板中使用标记扩展时,没有目标元素(很明显)。在这种情况下,您应该在ProvideValue()中使用returnthis-这样在应用模板时将再次调用扩展。公共类TranslateExtension:MarkupExtension{privatereadonlyBindingBase_binding;公共TranslateExtension(BindingBase绑定){_binding=绑定;}publicTranslateExtension(stringkey){Key=key;}[ConstructorArgument("key")]publicstringKey{get;放;}publicoverrideobjectProvideValue(IServiceProviderserviceProvider){if(_binding!=null){varpvt=(IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));vartarget=pvt.TargetObjectasDependencyObject;//如果我们在模板中,WPF将在应用时再次调用我们if(target==null)returnthis;BindingOperations.SetBinding(target,ValueProperty,_binding);Key=(string)target.GetValue(ValueProperty);BindingOperations.ClearBinding(target,ValueProperty);}//现在使用Key进行翻译return...;}privatestaticreadonlyDependencyPropertyValueProperty=DependencyProperty.RegisterAttached("Value",typeof(string),类型的(翻译扩展));无法获得绑定值你不应该尝试这样做。WPF使用一些奇特的反射来绕过绑定并相信我——您不会自己开始尝试。无论如何,这就是我最终做的,这实际上是一个很好的解决方案:我制作了一个负责翻译的TranslateConverter:??参数为字符串;if(key!=null){//根据key做翻译}returnnull;然后在我的TranslateExtension中我只是做:varbinding=KeyasBinding??新绑定{Mode=BindingMode.OneWay};binding.Converter=newTranslateConverter(_targetObject,_targetProperty,Dictionary,Converter);binding.ConverterParameter=关键是绑定?null:键为字符串;返回binding.ProvideValue(serviceProvider);由WPF解析并作为值传递给转换器,简单文本键作为参数传递给转换器。_targetObject和_targetProperty是从ServiceProvider获得的。以上就是C#学习教程:如何解决MarkupExtension中数据绑定的值?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
