wpf - data - mvvm xamarin español
¿Cómo puedo decirle a mi DataTemplate que se vincule a una propiedad en el modelo de vista padre? (1)
Tengo el siguiente archivo MainView.xaml que funciona bien como un conmutador de menú MVVM. Tengo estos pares:
- Page1View / Page1ViewModel
- Page2View / Page2ViewModel
en mi MainViewModel llene un ObservableCollection con ambos ViewModels, luego cuando el usuario hace clic en el botón Next , llama a NextPageCommand en MainViewModel, que alterna CurrentPageViewModel con un nuevo ViewModel que luego se muestra con una vista apropiada, funciona bien.
También tengo un menú lleno con todos los títulos de ViewModels en la colección Observable, que también funciona muy bien.
Sin embargo, cada MenuItem tiene un Command = "{Binding SwitchPageCommand}" que DEBERÍA llamar a SwitchPageCommand en MainViewModel y no en, por ejemplo, Page1ViewModel o Page2ViewModel .
Entonces, ¿cómo puedo indicar en la plantilla que no se vincule con el ViewModel actual sino con el ViewModel que contiene ese ViewModel, por ejemplo, algo como esto?
PSEUDO-CODE:
<DataTemplate x:Key="CodeGenerationMenuTemplate">
<MenuItem
Command="{Binding <parentViewModel>.SwitchPageCommand}"
Header="{Binding Title}"
CommandParameter="{Binding Title}"/>
</DataTemplate>
Aquí está 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>
La respuesta es esta:
<DataTemplate x:Key="CodeGenerationMenuTemplate">
<MenuItem
Header="{Binding Title}"
Command="{Binding DataContext.SwitchPageCommand,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Menu}}}"
CommandParameter="{Binding Title}"/>
</DataTemplate>
Acabo de ver que Nir me ha dado la sintaxis para resolver el problema anterior en esta pregunta: ¿Cuál es la mejor manera en MVVM para crear un menú que muestre varias páginas? .