2016-08-05 68 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

相关问题