我有一个有趣的
MarkupExtension
用例,服务于 IValueConverter
,它接受 int
(Counter
),并将其映射到 L10N 格式的本地化。我不确定如何最好地解决这个问题,是否可以解决这个问题。
<TextBlock Text="{Binding Path=Counter, Converter={wpf:GettextFormatConverter Binding string format support: {0:n0}}}" HorizontalAlignment="Center" />
映射本身的格式正确,但我想通过以下方式了解 XAML 内容区域。
我可以添加一个简单的 MarkupExtension 属性
DomainName
,无论如何我可能都会这样做,但它只是感觉很尴尬,即
<TextBlock Text="{Binding Path=Counter, Converter={wpf:GettextFormatConverter Binding string format support: {0:n0}}, DomainName=Example}" HorizontalAlignment="Center" />
我想从父 L10N 内容包装器中辨别
DomainName
,即
<LocalizationContent DomainName="Example">
<TextBlock Text="{Binding Path=Counter, Converter={wpf:GettextFormatConverter Binding string format support: {0:n0}}}" HorizontalAlignment="Center" />
</LocalizationContent>
当扩展名直接映射到控件文本或内容中时,我可以轻松做到这一点。
<LocalizationContent DomainName=Example>
<TextBlock Text="{wpf:Gettext Varying case example:}" HorizontalAlignment="Center" />
</LocalizationContent>
在这种情况下,
TargetObject
和相应的TargetProperty
分别是DependencyObject
和DependencyProperty
。这有助于发现 FrameworkElement
父母。
但不在主要目标用例中。问题是,这个用例中的
TargetObject
是 Binding
,而不是父 TextBlock
FrameworkElement
。问题是:如何最好地从 TextBlock
上下文中识别 FrameworkElement
(ProvideValue
)?不必跳入 XAML 服务提供程序,这种性质的事情。
编辑:公平的观点,提供了一些澄清。我并不是在谈论受约束的价值观本身。我想要访问
TextBlock
(FrameworkElement
)。我不关心 Binding
(或 MultiBinding
)本身。然而,暴露的TargetObject
不是DependencyObject
,而是Binding
(或MultiBinding
)。
所以我的问题很简单,有办法吗?
// 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);
}
有道理吗?我需要了解的内容可以更清楚吗?
因此,幽默安迪和乔的反应,做天真的事情并交换多重绑定,那里的网络,而不是
Binding
为TargetOject
,现在是MultiBinding
,表面上看,更多或更多低于我的预期。确实如此。我不明白如何获得主机 TextBlock
FrameworkElement
的可见性,为此 DependencyProperty
(DependencyObject
) 绑定正在发生。
<TextBlock HorizontalAlignment="Center">
<TextBlock.Text>
<MultiBinding Converter="{wpf:GettextMultiFormatConverter Binding string format support: {0:n0}}">
<Binding Path="Counter" Mode="OneWay" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>