2009-06-22 10 views
32

Mam następujący plik MainView.xaml, który działa również jako przełącznik menu MVVM. Mam te pary:Jak mogę powiedzieć, że moje DataTemplate wiąże się z właściwością w PARENT ViewModel?

  • Page1View/Page1ViewModel
  • Page2View/Page2ViewModel

w moim MainViewModel wypełnić ObservableCollection z obu ViewModels, wtedy, gdy użytkownik kliknie Następny przycisk, wywołuje NextPageCommand w MainViewModel, który wyłącza CurrentPageViewModel z nowym ViewModel, który jest następnie displa yed z odpowiednim widokiem, działa ładnie.

Mam również Menu wypełnione wszystkie tytuły z ViewModels w kolekcji Observable, który również działa ładnie.

Jednak każda pozycja menu ma polecenie = "{Wiążąca komenda zmiany strony}", która POWINIENaby wywołać polecenie SwitchPageCommand na MainViewModel, a nie na przykład na Page1ViewModel lub Page2ViewModel.

Więc jak mogę wskazać w szablonie nie wiążą się z bieżącym ViewModel ale ViewModel które zawiera że ViewModel, np coś takiego:

PSEUDO-CODE: 

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

Oto 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> 

Odpowiedz

56

Odpowiedź jest taka:

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

Właśnie zobaczyłem, że Nir dał mi składnię, aby rozwiązać powyższy numer na to pytanie: What is the best way in MVVM to build a menu that displays various pages?.

+1

Gdybym mógł dwa razy to głosować, zrobiłbym to. –

Powiązane problemy