WPF转换器静态文本

问题描述:

我想实现我自己的转换器使用转换器。在转换器中,我调用一个包含翻译的静态类。这个翻译在应用程序启动时加载。WPF转换器静态文本

使用该转换器对我来说,主要优势有三:

  1. 我基于XML语言文件翻译在运行时的文本。
  2. 执行应用程序时,我在其他XML文件中注册没有翻译的文本,所以我稍后可以添加翻译。
  3. 当需要时,翻译也适用于数据。

一切工作正常,当翻译的文本来自一个绑定属性,每例如:

<TextBox Grid.Row="1" Text="{Binding NameToShow, Converter={StaticResource TranslationConverter}}"></TextBox> 

的问题是翻译静态文本如标签,按钮的内容...这个想法正在像这个:

<Button Content={Binding "MyText",Converter={StaticResource TranslationConverter}} Command="{Binding InitializeAdapterCommand}"></Button> 

很明显,我不想在资源中声明静态字符串或使用可绑定属性。

有什么建议吗?

您可以创建自己的MarkupExtension而不是依赖于绑定:

public class StaticTranslation : MarkupExtension 
{ 
    public StaticTranslation() 
    { 
    } 

    public StaticTranslation(string textToTranslate) 
    { 
     TextToTranslate = textToTranslate; 
    } 

    public string TextToTranslate { get; set; } 

    public IValueConverter Converter { get; set; } 

    public object ConverterParameter { get; set; } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     if (Converter != null) 
     { 
      return Converter.Convert(TextToTranslate, typeof(string), ConverterParameter, CultureInfo.CurrentUICulture); 
     } 
     return TextToTranslate; 
    } 
} 

而且随着lib使用它作为xmlns:lib=[namespace containing StaticTranslation]

<TextBlock Text="{lib:StaticTranslation 'ABC',Converter={StaticResource TranslationConverter}}"/> 

Ofcourse在StaticTranslation转换器的使用仅仅是一个例子。您可能想要测试/改进生产使用的代码。

旁注:

如果嵌套Converter={StaticResource TranslationConverter}时出现错误,请将您的标记扩展到一个单独的类库项目。请参阅以下内容:https://stackoverflow.com/a/11785549/5265292

+0

它可以完美运行。我已经在一个类库项目中定义了Converter用于重用,所以它工作正常。谢谢。 – Alvaro

可以使用Binding.Source属性为一个常量的值传递给一个转换器:

Text="{Binding Source='My Text', Converter={StaticResource TranslationConverter}}" 
+0

哦,亲爱的,我在选择写回答之前,想给绑定源提供某种'x:Static',但我完全没有尝试最简单的源代码分配,已经在考虑复杂。 +1 – grek40

+0

@ grek40,'“{Binding Source = {x:Static smth}}”'也在工作:) (https://stackoverflow.com/questions/45175467/return-singleton-value-in-mvvm-对于结合)。 “'Binding Source = {StaticResource resourseKey}}”' – ASh

+0

是的,我知道......但我不知何故试图将这样的扩展与直接写入文本并不使用它来获取资源或静态属性,因为问题不是重定向到资源或财产:) – grek40