Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用WPF和MVVM将组合框中选定的数据从一个窗口显示到另一个窗口?_C#_Wpf_Mvvm - Fatal编程技术网

C# 如何使用WPF和MVVM将组合框中选定的数据从一个窗口显示到另一个窗口?

C# 如何使用WPF和MVVM将组合框中选定的数据从一个窗口显示到另一个窗口?,c#,wpf,mvvm,C#,Wpf,Mvvm,我刚刚开始学习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>