2016-08-05 69 views
1

我有一個標準菜單,其中的標題綁定到一個viewmodel中的列表,並且我想綁定來自另一個viewmodel的命令。我希望這能夠改變應用程序中的語言。我這樣定義的菜單:如何將兩個不同的屬性綁定到兩個不同的數據上下文WPF C#

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

其中MenuViewModel包含所有的命令,並呼籲LanguageViewModel另一視圖模型包含了所有的報頭。然後我要每個菜單項定義是這樣的:

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

這意味着只是一個菜單項至少5行代碼,菜單可能含有超過30周的MenuItems ... 有沒有簡單的方法來做到這一點?我在想模板,但不知道我會怎麼做。

+0

什麼是'menu.project.addnode '?如果您以這種方式進行本地化,我認爲使用帶有特定於語言環境的資源的'DynamicResource'可能會更容易。但是如果你在這種方法中有一些時間,另一種選擇可能是有一個全局靜態languageviewmodel實例,只需將一個n x:Static關鍵字傳遞給一個ValueConverter,它將從languageviewmodel返回適當的值。或者更容易,給每一個常規的viewmodel一個靜態languageviewmodel的引用,這樣你就可以使用相同的DataContext。 –

+0

您可以使附加行爲爲「MenuItem」設置標題。在xaml中看起來像這樣:''。 – Sinatr

+0

我對每種語言都使用了所有字符串的文件,並且menu.peoject.addnode是其中一個鍵。然後我解析該文件並將所有鍵值對放入Dictionary中。我希望能夠動態地將語言添加到應用程序中,這是我認爲最好的方式。有沒有實現本地化的標準方式? – 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

Aaah這就是我正在尋找!很有幫助。 – walle

相關問題