私は現在、ユーザーが選択した言語に基づいて実行時にインターフェイス テキストを交換できる多言語アプリに取り組んでいます。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>