让我问这个的标记扩展是Catel的LanguageBinding
。
到目前为止,我使用的是Infralution's localization assembly,它的工作方式大致相同。
Catel :
<TextBlock Text="{LanguageBinding MyText}"/>
Infralution :
<TextBlock Text="{Resx MyText}"/>
但正如您所看到的,标记扩展的写入时间更短,因此不太容易出现拼写错误。
所以我想知道是否有任何方法可以将LanguageBinding与另一个标记扩展词一起使用,例如:
理想:
<TextBlock Text="{LB MyText}"/>
我很清楚可读性问题等等,这是一个例子。
答案 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));