2016-08-05 17 views
1

ヘッダーが1つのビューモデル内のリストにバインドされている標準メニューがあり、別のビューモデルからコマンドをバインドしたいと思います。私はこれがアプリケーションの言語を変更できるようにしたい。2つの異なるデータコンテキストに2つの異なる属性をバインドする方法WPF C#

<Menu DockPanel.Dock="Top" DataContext="{Binding MenuViewModel, Mode=OneWay, Source={StaticResource mainViewModel}}"> 

MenuViewModelは、すべてのコマンドが含まれており、LanguageViewModelと呼ばれる別のviewmodelは、すべてのヘッダーが含まれています。私はこのようなメニューを定義しました。 がこれを行うには任意の簡単な方法があります...ただ一つのMenuItemのためのコードの少なくとも5行を意味し、メニューは30以上のMenuItemが含まれている可能性がある

  <MenuItem Command="{Binding Path=NewProjectCommand}"> 
       <MenuItem.Header> 
        <Label DataContext="{StaticResource languageViewModel}" Content="{Binding Path=Names[menu.project.addnode]}" /> 
       </MenuItem.Header> 
      </MenuItem> 

:私は、このように、すべてのMenuItemを定義する必要があります?私はテンプレートについて考えていたが、どうやってそれをするのか分からない。

+0

'menu.project.addnodeは何ですか'?このようにローカライズを行っているなら、最終的には、ロケール固有のリソースとともに 'DynamicResource'を使う方が簡単かもしれないと思います。しかし、このアプローチで時間がある場合は、グローバル静的languageviewmodelインスタンスを持ち、nx:StaticキーをValueConverterに渡して、languageviewmodelから適切な値を返すようにすることもできます。または、より簡単に、すべての通常のビューモデルに静的な言語ビューモデルへの参照を与え、同じDataContextから作業することができます。 –

+0

'MenuItem'のヘッダーを設定するように動作させることができます。 xamlでは次のようになります: ''。 – Sinatr

+0

私はすべての言語のすべての文字列を持つファイルを使用しています。また、menu.peoject.addnodeはキーの1つです。次に、ファイルを解析し、すべてのキー値ペアを辞書に入れます。私は、アプリケーションに動的に言語を追加できるようにしたいと考えていました。これが私が思った最良の方法でした。ローカリゼーションを実装する標準的な方法はありますか? – walle

答えて

1

menu.project.addnodeは、文字列キー、私のために次のような作品である場合:

<MenuItem 
    Command="{Binding NewProjectCommand}" 
    Header="{Binding Names[menu.project.addnode], Source={StaticResource languageViewModel}" 
    /> 

ここで私はローカライズ文字列を使用急ごしらえのテストVMです:

public class LanguageViewModel 
{ 
    public Dictionary<string, string> Names { get; } = new Dictionary<string, string> 
    { 
     { "menu.project.addnode", "Add New Node" } 
    }; 
} 
+0

これは私が探しているものです!非常に役立ちます。 – walle

関連する問題