标记扩展可以别名吗?
本文关键字:别名 扩展 | 更新日期: 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));