我有以下MainView.xaml文件,可以很好地作为一个MVVM菜单切换器。我有这些对:如何告诉我的DataTemplate绑定到PARENT ViewModel中的属性?
- Page1View/Page1ViewModel
- Page2View/Page2ViewModel
在我MainViewModel我填一个ObservableCollection两者的ViewModels,那么当用户点击下一页按钮,它调用NextPageCommand在MainViewModel中切换出CurrentPageViewModel与一个新的ViewModel然后显示用适当的视图进行操作,效果很好。
我也有一个菜单被Observable集合中的ViewModels的所有标题填充,这也很好地工作。但是,每个MenuItem都有一个Command =“{Binding SwitchPageCommand}”,它应该在MainViewModel上调用SwitchPageCommand,而不是在例如。 Page1ViewModel或Page2ViewModel。
那么,怎样才能在我的模板表示不绑定到当前视图模型,但视图模型这包含即视图模型,例如像这样:
PSEUDO-CODE:
<DataTemplate x:Key="CodeGenerationMenuTemplate">
<MenuItem
Command="{Binding <parentViewModel>.SwitchPageCommand}"
Header="{Binding Title}"
CommandParameter="{Binding Title}"/>
</DataTemplate>
这里是MainViewModel:
<Window x:Class="TestMenu234.Views.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c="clr-namespace:TestMenu234.Commands"
xmlns:vm="clr-namespace:TestMenu234.ViewModels"
xmlns:v="clr-namespace:TestMenu234.Views"
Title="Main Window" Height="400" Width="800">
<Window.Resources>
<DataTemplate x:Key="CodeGenerationMenuTemplate">
<MenuItem Header="{Binding Title}" Command="{Binding SwitchPageCommand}" CommandParameter="{Binding Title}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:Page1ViewModel}">
<v:Page1View/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:Page2ViewModel}">
<v:Page2View/>
</DataTemplate>
</Window.Resources>
<DockPanel>
<Menu DockPanel.Dock="Top">
<MenuItem Header="Code _Generation" ItemsSource="{Binding AllPageViewModels}"
ItemTemplate="{StaticResource CodeGenerationMenuTemplate}"/>
</Menu>
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
<Button Margin="5" Content="Next Page" Command="{Binding NextPageCommand}"/>
</StackPanel>
<ContentControl
Content="{Binding CurrentPageViewModel}"/>
</DockPanel>
</Window>
如果我可以两次投票,我会。 – 2012-01-11 02:31:03