Edw*_*uay 33 data-binding wpf xaml mvvm
我有以下MainView.xaml文件,它可以很好地用作MVVM菜单切换器.我有这些配对:
在我的MainViewModel中,我用两个ViewModel填充ObservableCollection,然后当用户单击Next按钮时,它调用MainViewModel中的NextPageCommand,它将一个新的ViewModel 切换出CurrentPageViewModel,然后用适当的View显示,效果很好.
我还有一个菜单填充了Observable集合中ViewModels的所有标题,这也很好用.
但是,每个MenuItem都有一个Command ="{Binding SwitchPageCommand}",它应该在MainViewModel上调用SwitchPageCommand,而不是在例如Page1ViewModel或Page2ViewModel上调用.
那么我怎么能在模板中指出不要绑定到当前的ViewModel,而是包含 ViewModel的ViewModel,例如:
PSEUDO-CODE:
<DataTemplate x:Key="CodeGenerationMenuTemplate">
<MenuItem
Command="{Binding <parentViewModel>.SwitchPageCommand}"
Header="{Binding Title}"
CommandParameter="{Binding Title}"/>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
这是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>
Run Code Online (Sandbox Code Playgroud)
Edw*_*uay 56
答案是这样的:
<DataTemplate x:Key="CodeGenerationMenuTemplate">
<MenuItem
Header="{Binding Title}"
Command="{Binding DataContext.SwitchPageCommand,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Menu}}}"
CommandParameter="{Binding Title}"/>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
我刚刚看到Nir给了我解决上述问题的语法:MVVM中构建显示各种页面的菜单的最佳方法是什么?.
归档时间: |
|
查看次数: |
28473 次 |
最近记录: |