WPF MVVM navigate views
j'ai une application WPF avec plusieurs vues. Je veux toswitch de la vue 1 à la vue 2 et de là je peux passer à des vues multiples. Donc je veux un bouton sur la vue 1 qui charge la vue 2 dans la même fenêtre.
j'ai essayé ces choses, mais ne peux pas le faire fonctionner.
- comment naviguer à travers les fenêtres avec la lumière MVVM pour WPF?
- http://blog.galasoft.ch/archive/2011/01/06/navigation-in-a-wp7-application-with-mvvm-light.aspx
du premier lien le problème est que je ne comprends pas le code de viewmodellocator. Ils appellent la fonction CreateMain(); mais où est-ce défini, et comment puis-je passer à une autre vue à partir d'une vue.
4 réponses
tout d'abord, vous n'avez pas besoin de ces outils/cadres pour mettre en œuvre MVVM. Il peut être aussi simple que cela... supposons que nous ayons un MainViewModel
, et un PersonViewModel
et un CompanyViewModel
, chacun avec sa propre vue apparentée et chacun prolongeant une abstract
classe de base BaseViewModel
.
dans BaseViewModel
, nous pouvons ajouter des propriétés communes et/ou des instances ICommand
et implémenter l'interface INotifyPropertyChanged
. Comme ils étendent tous la classe BaseViewModel
, nous pouvons avoir cette propriété dans la classe MainViewModel
qui peut être réglée sur n'importe lequel de nos modèles de vue:
public BaseViewModel ViewModel { get; set; }
bien sûr, vous mettriez en œuvre l'interface INotifyPropertyChanged
correctement sur vos" propriétés 1519330920 " contrairement à cet exemple rapide. Maintenant dans App.xaml
, nous déclarons quelques simples DataTemplate
pour relier les vues avec les modèles de vue:
<DataTemplate DataType="{x:Type ViewModels:MainViewModel}">
<Views:MainView />
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModels:PersonViewModel}">
<Views:PersonView />
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModels:CompanyViewModel}">
<Views:CompanyView />
</DataTemplate>
maintenant, où que nous utilisions l'une de nos instances BaseViewModel
dans notre application, ces DataTemplate
s vont dire au framework d'afficher la vue associée à la place. Nous pouvons les afficher comme ceci:
<ContentControl Content="{Binding ViewModel}" />
donc tout ce que nous devons faire maintenant pour passer à une nouvelle vue est de définir la propriété ViewModel
de la classe MainViewModel
:
ViewModel = new PersonViewModel();
enfin, comment changer les vues des autres vues? Eh bien, il ya plusieurs façons de le faire, mais le plus simple est d'ajouter un Binding
de l'enfant vue directe sur un ICommand
dans le MainViewModel
. J'utilise une version personnalisée du RelayComand
, mais vous pouvez utiliser n'importe quel type que vous aimez et je devine que vous obtiendrez l'image:
public ICommand DisplayPersonView
{
get { return new ActionCommand(action => ViewModel = new PersonViewModel(),
canExecute => !IsViewModelOfType<Person>()); }
}
Dans la vue enfant XAML:
<Button Command="{Binding DataContext.DisplayPersonView, RelativeSource=
{RelativeSource AncestorType={x:Type MainView}}, Mode=OneWay}" />
C'est ça! Profiter.
quand j'ai commencé avec le MVVM, j'ai aussi eu du mal avec les différents MVVM-frameworks et surtout la partie navigation. Donc j'utilise ce petit tutoriel que j'ai trouvé, que Rachel Lim a créé. C'est très joli et très bien expliqué.
consultez le lien suivant:
Espère que ça a aidé vous:)
peut-être ce lien vous aidera. Il suffit de définir la propriété NavigateTo
à la vue que vous devez afficher sur la fenêtre.
comme exemple, vous pouvez faire quelque chose comme
<Window x:Class="MainWindowView" 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:meffed="http:\www.codeplex.com\MEFedMVVM"
meffed:ViewModelLocator.NonSharedViewModel="YourViewModel"
WindowStartupLocation="CenterScreen">
<Button meffed:NavigationExtensions.NavigateTo="firstview"
meffed:NavigationExtensions.NavigationHost="{Binding ElementName=_viewContainer}"
meffed:NavigationExtensions.NavigateOnceLoaded="False"
Visibility="Visible" />
<ContentControl x:Name="_viewContainer" Margin="0,0,0,10" />
<Window>
alors le fichier de classe serait
public partial class MainWindowView : Window
{
public MainWindowView()
{
InitializeComponent();
}
public ContentControl ViewContainer { get { return _viewContainer; } }
}
alors vous pouvez définir chaque vue comme UserControl
et puis en utilisant le lien que j'ai donné ci-dessus lient le bouton meffed:NavigationExtensions.NavigateTo="secondView"
. Pour cibler le ContentControl
de le Window
n'utilise qu'une reliure RelativeSource
. For E. g
meffed:NavigationExtensions.NavigationHost="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}},Path=ViewContainer}"
dans chaque vue il suffit de voir que vous annotez le code derrière la définition de classe avec le [NavigationView("firstview")]
et ainsi de suite.
C'est compliqué pour la première fois, mais il sera très facile une fois que vous comprenez l'idée.
<ContentControl x:Name="K.I.S.S" Content="{Binding ViewModel, Converter={StaticResource ViewLocator}}"/>