2017-02-16 1 views
-1

i'am construit actuellement un logiciel qui, comme plusieurs point de vue et je voudrais passer d'une vue à l'autre en cliquant sur un bouton sur la vue actuelle: enter image description hereProbleme traitant plusieurs MVVM vue en

bien sûr J'ai plus de 3 vues mais c'est pour illustrer le concept. voici mon code pour aller de la page 1 à la page 2. mais j'ai du mal à aller de la page 2 à la page 3 je ne sais pas ce qui ne va pas. Merci de votre aide.

MainWindow.xaml

<Controls:MetroWindow x:Class="maquette.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"  
     xmlns:local="clr-namespace:maquette" 
     xmlns:viewModel ="clr-namespace:maquette.ViewModel" 
     xmlns:view ="clr-namespace:maquette.View" 
     BorderBrush="{DynamicResource AccentColorBrush}" 
     BorderThickness="2" 
     mc:Ignorable="d" 
     Title="MainWindow"> 

    <Window.Resources> 
     <DataTemplate DataType="{x:Type viewModel:page1ViewModel}"> 
      <local:Page1/> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type viewModel:page2ViewModel}"> 
      <view:Page2/> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type viewModel:page3ViewModel}"> 
      <view:Page3/> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type viewModel:page4ViewModel}"> 
      <view:Page4/> 
     </DataTemplate> 
    </Window.Resources> 

    <Grid> 
     <Controls:TransitioningContentControl x:Name="pagesControl" 
               Content="{Binding SelectedViewModel}" 
               Transition="Left" 
               /> 
    </Grid> 

</Controls:MetroWindow> 

MainWindow.cs

public MainWindow() 
{ 
    InitializeComponent(); 

    var viewModel = new NavigationViewModel(); 

    viewModel.SelectedViewModel = new page1ViewModel(viewModel); 

    this.DataContext = viewModel; 
} 

NavigationViewModel.cs

public class NavigationViewModel : INotifyPropertyChanged 
{ 

    private object selectedViewModel; 

    public object SelectedViewModel 
    { 
     get 
     { 
      return selectedViewModel; 
     } 
     set 
     { 
      selectedViewModel = value; 
      OnPropertyChanged("SelectedViewModel"); 
     } 
    } 

    /// <summary> 
    /// 
    /// </summary> 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
     } 
    } 
} 

Page1.xaml

<UserControl x:Class="maquette.Page1" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:maquette.View" 
      xmlns:viewModel="clr-namespace:maquette.ViewModel" 
      d:DesignHeight="300" d:DesignWidth="300" 
      mc:Ignorable="d"  
      > 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="100"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 


     <TextBlock x:Name="Title" 
        HorizontalAlignment="Center" 
        TextWrapping="Wrap" 
        VerticalAlignment="Center" 
        Width="320" 
        FontSize="30" 
        Grid.ColumnSpan="2" 
        FontFamily="Segoe UI" 
        FontWeight="Bold">File Control Program</TextBlock> 


     <Button x:Name="button" 
       HorizontalAlignment="Center" 
       VerticalAlignment="Center" 
       Grid.RowSpan="2" 
       Width="180" 
       Height="90" 
       Style="{StaticResource AccentedSquareButtonStyle}" 
       Command="{Binding Path=goSettings}" 
       > 
      <TextBlock Text="go page 2" 
         TextWrapping="Wrap" 
         TextAlignment="Center"/> 
     </Button> 
    </Grid> 
</UserControl> 

page1ViewModel

class page1ViewModel 
{ 
    public ICommand goSettings { get; set; } 

    private readonly NavigationViewModel _navigationViewModel; 

    public page1ViewModel(NavigationViewModel navigationViewModel) 
    { 
     _navigationViewModel = navigationViewModel; 
     goSettings = new BaseCommand(OpenSettings); 
    } 
    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="obj"></param> 
    private void OpenSettings(object obj) 
    { 
     _navigationViewModel.SelectedViewModel = new page2ViewModel(); 
    } 
} 

page2.xaml

<UserControl x:Class="maquette.View.Page2" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" 
      xmlns:local="clr-namespace:maquette.View" 
      xmlns:view ="clr-namespace:maquette.View" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300" 
      Background="White"> 

    <Grid> 
     <Button x:Name="button" 
       HorizontalAlignment="Center" 
       VerticalAlignment="Center" 
       Grid.ColumnSpan="2" 
       Grid.Row="4" 
       Width="180" 
       Height="80" 
       Style="{StaticResource AccentedSquareButtonStyle}" 
       Command="{Binding Path=goPage3}"> 
      <TextBlock Text="Go page 3" 
         TextWrapping="Wrap" 
         TextAlignment="Center" 
         FontSize="20" 
         /> 
     </Button> 
    </Grid> 
</UserControl> 

page2.cs

public Page2() 
{ 
    InitializeComponent(); 
    var viewModel = new NavigationViewModel(); 
    DataContext = new page2ViewModel(viewModel); 
} 

page2ViewModel.cs

public class page2ViewModel 
    { 

     public ICommand goPage3 { get; set; } 

     private readonly NavigationViewModel _navigationViewModel; 

     public page2ViewModel() 
     { 

     } 
     public page2ViewModel(NavigationViewModel navigationViewModel) 
     { 
      _navigationViewModel = navigationViewModel; 
      goPage3 = new BaseCommand(OpenPage3); 
     } 
     /// <summary> 
     /// 
     /// </summary> 
     /// <param name="obj"></param> 
     private void OpenPage3(object obj) 
     { 
      _navigationViewModel.SelectedViewModel = new page3ViewModel(); 
     } 
} 

Mais comme je l'ai dit la transition entre la page 2 et 3 ne fonctionne pas. de l'aide ? Je vous remercie !

Répondre

1

Supprimer cette surcharge constructeur de page2ViewModel:

public page2ViewModel() 
{ 

} 

Et toujours l'injecter avec le seul et unique NavigationViewModel dans page1ViewModel:

private void OpenSettings(object obj) 
{ 
    _navigationViewModel.SelectedViewModel = new page2ViewModel(_navigationViewModel); 
} 

Aussi ne définissez pas le DataContext de Page2 explicitement:

public Page2() 
{ 
    InitializeComponent(); 
} 

Le modèle de données s'assurera qu'il obtient le bon DataContext.

+0

ok, mais de la page 2 à la page 3 dois-je mettre: void OpenPage3 (objet obj) {privé _navigationViewModel.SelectedViewModel = new page3ViewModel (_navigationViewModel); } – Json

+0

et dans page3ViewModel: private readonly NavigationViewModel _navigationViewModel; public page3ViewModel (NavigationViewModel navigationViewModel) { _navigationViewModel = navigationViewModèle; } ?? – Json

+0

Oui, tous les modèles de vue qui devraient pouvoir naviguer devraient être injectés avec une référence à la classe NavigationViewModel. – mm8

0

Ceci est pour sans utiliser le cadre MVVM

données pour définir des modèles viewmodels enfants dans la fenêtre principale viewmodel.

Pour une application complète, vous devez créer un objet statique pour votre modèle de vue principal.

Ensuite, seules les vues seront modifiées.

Il devrait être comme ça ...

public partial class App : Application 
{ 
    public static MainWindowViewModel mainWindowViewModel; 

    public App() 
    { 
     mainWindowViewModel = new MainWindowViewModel(); 
    } 
} 

Dans MainWindow viewmodel

public class MainWindowViewmodel 
    { 

     private object selectedViewModel; 

     public object SelectedViewModel 
     { 
      get 
      { 
       return selectedViewModel; 
      } 
      set 
      { 
       selectedViewModel = value; 
       OnPropertyChanged("SelectedViewModel"); 
      } 
     } 
     public MainWindowViewmodel() 
     { 
      SelectedViewModel = new page1viewmodel(); 
     } 
    } 

En Page1Viewmodel dans

class page1ViewModel 
{ 
public ICommand goSettings { get; set; } 

private readonly NavigationViewModel _navigationViewModel; 

public page1ViewModel(NavigationViewModel navigationViewModel) 
{ 
    _navigationViewModel = navigationViewModel; 
    goSettings = new BaseCommand(OpenSettings); 
} 
/// <summary> 
/// 
/// </summary> 
/// <param name="obj"></param> 
private void OpenSettings(object obj) 
{ 
    mainWindowViewModel.SelectedViewModel = new page2ViewModel(); 
} 

}

comme cela, vous devez mettre en œuvre .

Cela va vous aider.