3

プログラムで 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 は空のままです。

4

1 に答える 1