标记扩展名是否可以别名?

时间:2015-10-02 08:36:13

标签: c# wpf xaml catel

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

到目前为止,我使用的是Infralution's localization assembly,它的工作方式大致相同。

Catel

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

Infralution

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

但正如您所看到的,标记扩展的写入时间更短,因此不太容易出现拼写错误。

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

理想

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

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

2 个答案:

答案 0 :(得分:2)

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

class SR : StaticResourceExtension
{
    public SR() {}

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

现在您需要使用{local:SR}之类的“别名”。

答案 1 :(得分:0)

您可以继承MarkupExtension以创建自己的自定义Binding标记

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