当MarkupExtension的TargetObject为Binding时,如何识别对应的FrameworkElement?
WPF MarkupExtension 作为Binding Converter时获取父级FrameworkElement的问题
我有一个MarkupExtension的实用场景:它作为IValueConverter的服务扩展,接收int类型的Counter值,并将其映射为L10N格式化的本地化内容。目前转换功能正常,但希望优化本地化域名的获取方式。
现有手动指定方式(繁琐)
可以给MarkupExtension添加DomainName属性手动指定,但这种方式操作起来比较繁琐:
<TextBlock Text="{Binding Path=Counter, Converter={wpf:GettextFormatConverter Binding string format support: {0:n0}}, DomainName=Example}" HorizontalAlignment="Center" />
理想的自动识别方式
更合理的方案是从父级LocalizationContent容器中自动识别DomainName:
<LocalizationContent DomainName="Example"> <TextBlock Text="{Binding Path=Counter, Converter={wpf:GettextFormatConverter Binding string format support: {0:n0}}}" HorizontalAlignment="Center" /> </LocalizationContent>
直接绑定控件属性时可正常实现
当MarkupExtension直接绑定到控件的Text或Content属性时,这种自动识别逻辑很容易实现:
<LocalizationContent DomainName="Example"> <TextBlock Text="{wpf:Gettext Varying case example:}" HorizontalAlignment="Center" /> </LocalizationContent>
此时TargetObject是DependencyObject,TargetProperty是DependencyProperty,能方便地向上查找父级FrameworkElement。
核心问题
但当MarkupExtension作为Binding的Converter使用时,TargetObject是Binding而非父级TextBlock这类FrameworkElement。现在需要解决的是:在ProvideValue上下文环境中,不借助XAML服务提供者,如何识别对应的TextBlock(FrameworkElement)实例?
补充说明:我只需要获取TextBlock(FrameworkElement)实例,完全不在意Binding或MultiBinding本身,当前的问题是暴露的TargetObject是Binding而非DependencyObject。
当前MarkupExtension实现代码
// Implementing the MarkupExtension, in service to a (Multi)Binding converter public override object ProvideValue(IServiceProvider serviceProvider) { // Convenience GetService extension method var valueProvider = serviceProvider.GetService<IProvideValueTarget>(); // TODO: never happens, since TargetObject was a (Multi)Binding if (valueProvider.TargetObject is DependencyObject dependencyObject) { // TODO: do something interesting with the DO } return Gettext(Localizer); }
内容的提问来源于stack exchange,提问作者Michael W. Powell
相关产品推荐
相关产品推荐

