标记扩展可以别名吗?

本文关键字:别名 扩展 | 更新日期: 2023-09-27 18:15:33

让我问这个问题的标记扩展名是Catel的LanguageBinding

到现在为止,我一直在使用Infralution的本地化程序集,其工作方式或多或少相同。

Catel :

<TextBlock Text="{LanguageBinding MyText}"/>

Infralution :

<TextBlock Text="{Resx MyText}"/>

但是正如您所看到的,标记扩展名写起来更短,因此更不容易出现拼写错误。

所以我想知道是否有任何方法可以将LanguageBinding与另一个标记扩展字一起使用,比如:

理想

:

<TextBlock Text="{LB MyText}"/>

我很清楚可读性问题,这是一个例子。

标记扩展可以别名吗?

这是不可能直接在XAML中做到的,但你可以从LanguageBinding中派生一个类并使用它。下面是一个缩短StaticResource标记扩展的示例。

class SR : StaticResourceExtension
{
    public SR() {}
    public SR(object resourceKey)
        :base(resourceKey)
    { }
}

现在你需要使用{local:SR}作为"别名"。

您可以继承MarkupExtension来创建您自己的自定义绑定标签

[MarkupExtensionReturnType(typeof(object))]
public class LBBinding : MarkupExtension
{
    private Binding _binding = new Binding();
    public Binding Binding
    {
        get { return _binding; }
        set { _binding = value; }
    }
    public PropertyPath Path
    {
        get { return _binding.Path; }
        set { _binding.Path = value; }
    }

<TextBox Text="{customBinding:LBBinding Path=DummyString}"></TextBox>

你还应该覆盖来自MarkupExtension的ProvideValue方法。此方法将在WPF执行实际绑定时触发。使用IServiceProvider获取你的DependencyObject (Control)和DependencyProperty(你的绑定属性)。然后你就可以用这两条信息施展你想要的魔法了。

    public override object ProvideValue(IServiceProvider provider)
    {
       var service = (IProvideValueTarget)provider.GetService(typeof(IProvideValueTarget));