4

私は現在、ユーザーが選択した言語に基づいて実行時にインターフェイス テキストを交換できる多言語アプリに取り組んでいます。ResourceDictionary で定義された DynamicResources を使用しており、言語が変更されたときに辞書ファイルを交換しています。これは、DataGrid の Column Header プロパティを除いて、すべてにうまく機能します。DataGrid 列はビジュアル ツリーの一部ではなく、以前は VM のプロパティにバインドするためにプロキシを使用していましたが、この場合は VM にバインドされていません。ResourceDictionary がスワップされたときに列ヘッダーを更新するにはどうすればよいですか?

辞書を交換する私の方法は以下のとおりです。これは Application.xaml.vb にあり、アプリの起動時に呼び出され、MySettings.Default に保存された文字列を渡します。これは、ComboBoxSelectedIndex にバインドされた VM のプロパティからメッセンジャーを使用して呼び出されることもあります。

Private Sub SetLanguage(ByVal language As String)
    Dim dic As ResourceDictionary = Nothing
    Dim langFile As String = Environment.CurrentDirectory & "\Languages\" & language & ".xaml"
    If File.Exists(langFile) Then
        Using fs As FileStream = New FileStream(langFile, FileMode.Open)
            dic = CType(XamlReader.Load(fs), ResourceDictionary)
            If LanguageCount > 0 Then
                    Resources.MergedDictionaries.RemoveAt(Resources.MergedDictionaries.Count - 1)
            End If
            Resources.MergedDictionaries.Add(dic)
        End Using
    End If
    LanguageCount += 1
End Sub

関連する DataGrid xaml

<DataGridTextColumn Header="{DynamicResource G_Spec}" ... />

ResourceDictionary エントリ

<system:String x:Key="G_Spec">Spec:</system:String>
4

1 に答える 1

5

HeaderTemplateこれは非常に単純化された例であり、基本的に列に使用できます。

<DataGridTemplateColumn>
    <DataGridTemplateColumn.HeaderTemplate>
        <DataTemplate>
            <TextBlock Text="{DynamicResource MyColumnHeaderText}" />
        </DataTemplate>
    </DataGridTemplateColumn.HeaderTemplate>
</DataGridTemplateColumn>
于 2013-10-17T18:46:04.460 に答える