¿Cómo puedo decirle a mi DataTemplate que se vincule a una propiedad en el ViewModel PRINCIPAL?


Tengo la siguiente Vista principal.archivo xaml que funciona bien como un conmutador de menú MVVM. Tengo estos pares:

  • Page1View / Page1ViewModel
  • Page2View / Page2ViewModel

En mi MainViewModel lleno una ObservableCollection con ambos ViewModels, luego cuando el usuario hace clic en el botón Next, llama a NextPageCommand en MainViewModel que desactiva CurrentPageViewModel con un nuevo ViewModel que es entonces se muestra con una vista adecuada, funciona muy bien.

También tengo un Menú lleno de todos los títulos de los ViewModels en la colección Observable, que también funciona muy bien.

Sin embargo, cada MenuItem tiene un Comando="{Binding SwitchPageCommand}" que DEBERÍA llamar a SwitchPageCommand en el MainViewModel y no en, por ejemplo, Page1ViewModel o Page2ViewModel.

Entonces, ¿cómo puedo indicar en la plantilla que no se vincule al ViewModel actual sino 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>
Author: Edward Tanguay, 2009-06-22

1 answers

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 había dado la sintaxis para resolver el problema anterior en esta pregunta: ¿Cuál es la mejor manera en MVVM para construir un menú que muestra varias páginas?.

 56
Author: Edward Tanguay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:46:21