C# 如何使用WPF和MVVM将组合框中选定的数据从一个窗口显示到另一个窗口?
我刚刚开始学习WPF和MVVM这两个概念。我目前正在开发一个名为:测验应用程序的应用程序。基本上,我希望用户在第一个窗口中写下自己的名字,并在测验中选择问题的难度级别 第一个窗口如下所示: 我接下来要做的是,当用户写下自己的名字并选择难度级别时,“下一步”按钮将打开另一个窗口,在其中显示以下消息: 欢迎他的名字! 您为测验选择了“简单/中等/困难”级别 我搜索了很多教程,但什么也没找到。他们中的大多数人在同一个窗口中显示这两条消息,但我想在新窗口中显示它们 你能帮我吗C# 如何使用WPF和MVVM将组合框中选定的数据从一个窗口显示到另一个窗口?,c#,wpf,mvvm,C#,Wpf,Mvvm,我刚刚开始学习WPF和MVVM这两个概念。我目前正在开发一个名为:测验应用程序的应用程序。基本上,我希望用户在第一个窗口中写下自己的名字,并在测验中选择问题的难度级别 第一个窗口如下所示: 我接下来要做的是,当用户写下自己的名字并选择难度级别时,“下一步”按钮将打开另一个窗口,在其中显示以下消息: 欢迎他的名字! 您为测验选择了“简单/中等/困难”级别 我搜索了很多教程,但什么也没找到。他们中的大多数人在同一个窗口中显示这两条消息,但我想在新窗口中显示它们 你能帮我吗 多谢各位 要打开新窗口,
多谢各位 要打开新窗口,必须创建其类的实例(因此必须调用构造函数) 另一方面,欢迎屏幕中有所有数据,因此我建议如下:
我会这样处理:
- 创建
,它将具有一个名为主视图模型
的属性,该属性属于基本视图模型或可观察对象类型,或者您孩子们现在所称的任何类型当前视图模型
- 创建一个具有内容控件的主窗口,它的内容将绑定到当前视图模型
- 为登录创建
(当前视图)用户控件
- 创建
登录视图模型
- 创建
主视图模型时,将
设置为默认值登录VM
- 现在创建
,它将保存该名称和难度设置下一个窗口VM
- 也为该vm创建用户控件
- 在主窗口中为每种类型的VM创建数据模板,以便内容控件知道使用什么
- 现在您已经为两个VM做好了准备,那么您将实现一个messenger模式。如本例所示。
现在,当您需要将信息从LoginVM传递到NextWindowVM时,您可以通过messenger从LoginVM实例或消息中检索信息。通过这种方式,您可以浏览任意多个虚拟机,并重用同一窗口。
现在我知道您刚刚开始使用WPF和MvvM,所以我猜您需要关于如何在xaml中执行此操作的指针:
主窗口:
当我看到你的问题时,我看到了关于“MainWindow.SelectedDegree”的字段警告,它不仅是一个字段(不适用于WPF绑定,需要是一个属性),而且不是MvvM的工作方式。如果您需要更多帮助,请告诉我们。鉴于他们刚刚输入了姓名并选择了难度级别,下一步只是再次向他们展示这些数据似乎有点奇怪。我原以为一旦你输入姓名并选择难度等级,下一步可能是提问。你必须把它放在某个地方。具有名称、级别、分数和问题列表、答案、选择的选项和bool的viewmodel似乎更合适。
// Constructor of next window
public NextWindow(string name, string level)
{
// If you are using MVVM, you want DataContext to hold data, so
// you most probably create your Datacontext here
var vm = new NextWindowViewModel();
// So you need to define appropriate properties in you ViewModel
vm.Name = name;
vm.Level = level;
DataContext = vm;
}
<Window x:Class="WPF.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:vm="clr-namespace:ViewModel;assembly=ViewModel" xmlns:views="clr-namespace:WPF_UserControls;assembly=WPF_UserControls" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<DataTemplate DataType="{x:Type vm:LoginViewModel}">
<views:Login/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:NextWindowViewModel}">
<views:NextWindow/>
</DataTemplate>
</Window.Resources>
<Window.DataContext>
<vm:MainViewModel/>
</Window.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ContentControl Grid.ColumnSpan="5" Content="{Binding CurrentViewModel}"/>
<Button Grid.Row="1" Content="Close" Command="{Bidning CloseCommand}"/>
</Grid>
</Window>