当 TargetObject 绑定时,MarkupExtension 识别 FrameworkElement

问题描述 投票:0回答:1

我有一个有趣的

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);
}

有道理吗?我需要了解的内容可以更清楚吗?

c# wpf xaml binding markup-extensions
1个回答
0
投票

因此,幽默安迪和乔的反应,做天真的事情并交换多重绑定,那里的网络,而不是

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>
© www.soinside.com 2019 - 2024. All rights reserved.