C# mvvm中几个视图的处理问题

C# mvvm中几个视图的处理问题,c#,wpf,mvvm,user-controls,contentcontrol,C#,Wpf,Mvvm,User Controls,Contentcontrol,我目前正在构建一个软件,它包含多个视图,我想通过单击当前视图上的按钮从一个视图切换到另一个视图: 当然,我有3个以上的观点,但这是为了说明这个概念。这是我从第1页转到第2页的代码。但是我很难从第二页转到第三页,我不知道怎么了。谢谢你的帮助 MainWindow.xaml <Controls:MetroWindow x:Class="maquette.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xam

我目前正在构建一个软件,它包含多个视图,我想通过单击当前视图上的按钮从一个视图切换到另一个视图:

当然,我有3个以上的观点,但这是为了说明这个概念。这是我从第1页转到第2页的代码。但是我很难从第二页转到第三页,我不知道怎么了。谢谢你的帮助

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>
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));
        }
    }
}
    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();
        }
}
page2ViewModel.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));
        }
    }
}
    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();
        }
}
公共类page2ViewModel
{
公共ICommand goPage3{get;set;}
私有只读NavigationViewModel _NavigationViewModel;
公共页面2ViewModel()
{
}
公共页面2视图模型(NavigationViewModel NavigationViewModel)
{
_navigationViewModel=navigationViewModel;
goPage3=新的BASECOMAND(OpenPage3);
}
/// 
/// 
/// 
/// 
私有void OpenPage3(对象对象对象)
{
_navigationViewModel.SelectedViewModel=新建页面3ViewModel();
}
}

但正如我所说,第2页和第3页之间的转换不起作用。有什么帮助吗?谢谢大家!

这是不使用任何mvvm框架的

在主窗口viewmodel中定义子viewmodel的数据模板

对于整个应用程序,您必须为主视图模型创建静态对象

然后只会更改视图

应该是这样的

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

    public App()
    {
        mainWindowViewModel = new MainWindowViewModel();
    }
}
在主窗口视图模型中

 public class MainWindowViewmodel
    {

        private object selectedViewModel;

        public object SelectedViewModel
        {
            get
            {
                return selectedViewModel;
            }
            set
            {
                selectedViewModel = value;
                OnPropertyChanged("SelectedViewModel");
            }
        }
        public MainWindowViewmodel()
        {
            SelectedViewModel = new page1viewmodel();
        }
    }
在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)
{
   mainWindowViewModel.SelectedViewModel   = new page2ViewModel();
}
class page1ViewModel
{
公共ICommand goSettings{get;set;}
私有只读NavigationViewModel _NavigationViewModel;
公共页面1视图模型(NavigationViewModel NavigationViewModel)
{
_navigationViewModel=navigationViewModel;
goSettings=新BASECOMAND(OpenSettings);
}
/// 
/// 
/// 
/// 
私有void OpenSettings(对象对象对象)
{
mainWindowViewModel.SelectedViewModel=new page2ViewModel();
}
}

像这样你必须实施


这将对您有所帮助。

page2ViewModel
中删除此构造函数重载:

public page2ViewModel()
{

}
并始终使用page1ViewModel中的一个且唯一的
NavigationViewModel

private void OpenSettings(object obj)
{
    _navigationViewModel.SelectedViewModel = new page2ViewModel(_navigationViewModel);
}
另外,不要明确设置
Page2
DataContext

public Page2()
{
    InitializeComponent();
}

数据模板将确保它获得正确的
DataContext

ok,但是从第2页到第3页,我应该放:private void OpenPage3(object obj){_navigationViewModel.SelectedViewModel=new page3ViewModel(_navigationViewModel);}在page3ViewModel中:私有只读NavigationViewModel\u NavigationViewModel;public page3ViewModel(NavigationViewModel NavigationViewModel){{u NavigationViewModel=NavigationViewModel;}??是的,应该能够导航的所有视图模型都应该注入对NavigationViewModel类的引用。
public page2ViewModel()
{

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