2016-08-05 10 views
1

Ich habe ein Standardmenü, in dem die Header an eine Liste in einem Viewmodel gebunden sind, und ich möchte den Befehl von einem anderen Viewmodel binden. Ich möchte, dass die Sprache in der Anwendung geändert werden kann. I definiert das Menü wie folgt aus:So binden Sie zwei verschiedene Attribute an zwei verschiedene Datenkontexte WPF C#

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

wo MenuViewModel alle Befehle enthält und eine andere Ansichtsmodell genannt LanguageViewModel enthält alle Header. Ich muss dann diese alle MenuItem wie definieren:

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

die nur mindestens 5 Zeilen Code bedeutet für ein MenuItem, und das Menü kann über 30 MenuItems enthalten ... Gibt es irgendeine einfachere Art und Weise, dies zu tun ? Ich habe über Vorlagen nachgedacht, weiß aber nicht, wie ich das machen würde.

+0

Was 'ist menu.project.addnode '? Wenn Sie die Lokalisierung auf diese Weise durchführen, könnte es am Ende einfacher sein, 'DynamicResource' mit Gebietsschema-spezifischen Ressourcen zu verwenden. Aber wenn Sie etwas Zeit in diesem Ansatz haben, könnte eine andere Möglichkeit eine globale static Sprachanzeigemodell-Instanz haben und einfach einen nx: Static Schlüssel an einen ValueConverter übergeben, der den entsprechenden Wert aus dem LanguageViewModel zurückgibt. Oder noch einfacher, geben Sie jedem regulären Viewmodel einen Verweis auf dieses statische Sprachbetrachtungsmodell, damit Sie mit demselben DataContext arbeiten können. –

+0

Sie können angehängtes Verhalten setzen, um Header für 'MenuItem' zu setzen. Will sieht in xaml so aus: ''. – Sinatr

+0

Ich benutze eine Datei mit allen Strings für jede Sprache, und menu.peoject.addnode ist einer der Schlüssel. Dann analysiere ich die Datei und lege alle Schlüsselwertpaare in ein Dictionary. Ich möchte der Anwendung dynamisch Sprachen hinzufügen können und das war der beste Weg, den ich dachte. Gibt es eine Standardmethode zur Lokalisierung? – walle

Antwort

1

Wenn menu.project.addnode ein String-Schlüssel ist, die folgenden Werke für mich:

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

Hier ist die schnelle Nummer Test VM ich für die Lokalisierungsstrings verwendet:

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

Aaah, das ist was ich suche! Sehr hilfreich. – walle

Verwandte Themen