2009-06-22 2 views
32

Ich habe die folgende MainView.xaml Datei, die gut als MVVM-Menü Switcher funktioniert. Ich habe diese Paare bekam:Wie kann ich meiner DataTemplate mitteilen, dass sie an eine Eigenschaft im PARENT ViewModel bindet?

  • Page1View/Page1ViewModel
  • Page2View/Page2ViewModel

in meinem MainViewModel Ich fülle eine ObservableCollection mit beiden Viewmodels, dann, wenn der Benutzer klickt auf die Next Schaltfläche ruft es NextPageCommand in MainViewModel, das CurrentPageViewModel mit einem neuen ViewModel ausschaltet, das dann angezeigt wird mit einer geeigneten Ansicht, funktioniert gut.

Ich habe auch ein Menü gefüllt mit allen Titeln aus den ViewModels in der Observable-Sammlung, die auch gut funktioniert.

Jedoch hat jede MenuItem ein Command = "{Binding SwitchPageCommand}", die auf der SwitchPageCommand MainViewModel und nicht auf beispielsweise nennen soll Page1ViewModel oder Page2ViewModel.

So wie kann ich in der Vorlage angeben, nicht auf das aktuelle Ansichtsmodell zu binden, aber das Ansichtsmodell, das enthält dass Ansichtsmodelle, z.B. so etwas wie dieses:

PSEUDO-CODE: 

<DataTemplate x:Key="CodeGenerationMenuTemplate"> 
    <MenuItem 
     Command="{Binding <parentViewModel>.SwitchPageCommand}" 
     Header="{Binding Title}" 
     CommandParameter="{Binding Title}"/> 
</DataTemplate> 

ist hier 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> 

Antwort

56

Die Antwort lautet:

<DataTemplate x:Key="CodeGenerationMenuTemplate"> 
    <MenuItem 
     Header="{Binding Title}" 
     Command="{Binding DataContext.SwitchPageCommand, 
    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Menu}}}" 
     CommandParameter="{Binding Title}"/> 
</DataTemplate> 

Ich habe gerade gesehen, dass Nir mir die Syntax gegeben hatte, die zu lösen obige Frage zu dieser Frage: What is the best way in MVVM to build a menu that displays various pages?.

+1

wenn ich dies zweimal abstimmen könnte, würde ich. –

Verwandte Themen