プログラムで WPF Localization Extension を使用しています。同様のリソース (「メートル単位の長さ」、「キロメートル単位の長さ」など) の量を減らすために、プレースホルダーを使用して XAML コードで設定したいと考えています。
私はこのようなことを考えました
リソース「UI_Length」の値
Length in {0}
CodeBehind では、これは String.Format で非常に簡単です
String.Format(
LocalizeDictionary.Instance.GetLocalizedObject("UI_Length", null, LocalizeDictionary.Instance.Culture).ToString(),
"Meters");
しかし、XAML で別の文字列や別のリソース エントリを追加するにはどうすればよいでしょうか?
<Label x:Name="Label" Content="{lex:LocText Key=UI_Length}, Meters" HorizontalAlignment="Left" VerticalAlignment="Top"/>
Binding placeholder from resource file in WPFによると、それは可能であるように見えますが、ラベルに対して実行することはできません
[アップデート]
2 つの Resource 値を追加することができました。トリックは、Label.Content に TextBlock を追加することでした。リンクを参照
<Label Grid.Row="1">
<Label.Content>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} [{1}]">
<Binding Source="{lex:LocText Key=UI_Length}" />
<Binding Source="{lex:LocText Key=UI_MeterShort}" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</Label.Content>
</Label>
しかし、ここでまだ問題があります。起動時にこれは正常に機能しますが、言語を切り替えようとすると
LocalizeDictionary.Instance.Culture = new CultureInfo("de-DE");
「バインドは使用後に変更できません」と表示されます。エラー。複数のリソース値を使用して、実行時に言語を切り替えることができる同様の方法はありますか?
【アップデート2】
Liero からの提案を試しましたが、まだ問題があります。
私の MainView では、DataContext を MainViewModel に設定しました。VM には LocalizedTexts のインスタンスがあります。ViewModel で言語を変更した後、RaisePropertiesChanged() を呼び出しますが、出力が得られません。
TextBlock は LengthInMeters にバインドされています
<TextBlock Text="{Binding LocalizedTexsts.LengthInMeters}" />
言語を変更した後、RaisePorpertyChanged を呼び出しています。
public void ChangeLanguage(string culture)
{
LocalizeDictionary.Instance.Culture = new CultureInfo(culture);
_localizedTexts.RaisePropertyChanged();
}
LengthInMeters は次のようになります。
public string LengthInMeters
{
get
{
return String.Format(
LocalizeDictionary.Instance.GetLocalizedObject(
"UI_Length", null,
LocalizeDictionary.Instance.Culture).ToString(),
LocalizeDictionary.Instance.GetLocalizedObject(
"UI_Meters", null,
LocalizeDictionary.Instance.Culture).ToString()
);
}
}
しかし、TextBlock は空のままです。