C# mvvm中几个视图的处理问题
我目前正在构建一个软件,它包含多个视图,我想通过单击当前视图上的按钮从一个视图切换到另一个视图: 当然,我有3个以上的观点,但这是为了说明这个概念。这是我从第1页转到第2页的代码。但是我很难从第二页转到第三页,我不知道怎么了。谢谢你的帮助 MainWindow.xamlC# 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
<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();
}