我是C++开发人员,是WPF和MVVM的新手。如果我选择了错误的单词问我的问题,请忍受我

我在 MFC/C++ 中有我的Main应用程序,该应用程序将一些数据传递到C#库中( CLI 被用作中间层)。
C#库中,有一段代码打开了一个对话框,填充了数据,并通过以下方式将用户选择通知给调用对象-

public classA()
{
    MyDialog dlg = new MyDialog(param1, param2, param3)
    if(dlg.ShowDialog().GetValueOrDefault())
    {
        var name = dlg.name;
        var roll = dlg.roll;
    }
    else
    {
        var name = string.Empty;
        var roll = string.Empty;
    }
}

现在,已使用 MVVM 模式修改并实现了Dialog。

我创建了以下文件作为实现的一部分-
1个
  • MyDialogView.Xaml
  • MyDialogView.xaml.cs
  • MyDialogViewModel.cs
  • MyDialogModel.cs

  • 我的问题是,现在如何从我的类A 实例化新对话框,以便使用传递给对话框的参数以与以前相同的方式填充数据,并记录用户选择而不会丢失任何数据并安全地关闭 View 。

    最佳答案

    标准MVVM方法的工作方式如下(至少在使用MVVM Light时):

  • 您有一个VM层,一个类库。
  • 您有一个View层,一个WPF控件库或WPF应用程序。
  • View层添加了对VM层的引用。 VM层对View一无所知。
  • 您可以为对话框的VM创建一个普通的公共(public)类。称它为DialogVM或其他名称。确保此类继承自MVVM Light的内置ViewModelBase。这将使您能够访问MVVM Light提供的更改通知方法。在您的情况下,可能看起来像这样:
    public partial class DialogVM : ViewModelBase
    {
        private string _Name;
        public string Name
        {
          get { return _Name; }
          set { Set(ref _Name, value); }
        }
    
        private string _Roll;
        public string Roll
        {
          get { return _Roll; }
          set { Set(ref _Roll, value); }
        }
    }
    
  • VM层具有一个名为ViewModelLocator的全局静态类。此类执行IoC/DI,并提供公共(public)静态属性以公开不同的VM。 (在您的情况下,对话框的VM进入VM项目,并且ViewModelLocator看起来像这样:
    using System;
    
    namespace VMLayer
    {
      public class ViewModelLocator
      {
        static ViewModelLocator()
        {
          SimpleIoc.Default.Register<DialogVM>(true);
        }
    
        public static DialogVM MyDialog => SimpleIoc.Default.GetInstance<DialogVM>();
      }
    }
    
  • 您的对话框(Window)转到“ View ”层,并使用此公开的属性MyDialog为对话框提供DataContext:
    <Window x:Class="GlasshouseTestingShell.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:vm="clr-namespace:VMLayer;assembly=VMLayer"
        DataContext="{x:Static vm:ViewModelLocator.MyDialog}"
        d:DataContext="{d:DesignInstance Type=vm:DialogVM}">
    </Window>
    
  • 看看我们如何干净地创建了View层的DataContext,而没有在View层中编写一行C#代码。从在Binding表达式和其他地方都获得所有设计时Intellisense的意义上来说,这也很优雅。
  • 现在,您将所有UI内容(文本框,按钮等)绑定(bind)到对话框VM公开的公共(public)属性和命令。后面的代码中仍然没有任何行。在您的情况下,可能看起来像这样:
    <TextBox Text="{Binding Name}" />
    

  • 其余的东西在C++中:
  • 您可以在C++项目中添加对View和VM DLL的引用。
  • 创建对话框的对象。它将自动实例化其VM并执行绑定(bind)。您调用ShowDialog()将其显示在屏幕上。
  • Use在对话框中执行操作,最后按OK或Cancel。
  • 捕获对话框结果,然后访问对话框对象的DataContext属性,该属性是DialogVM类的对象。您可以从中访问用户提供的值,因为绑定(bind)已在VM中为您更新了这些属性。
  • 关于c# - 在WPF中使用MVVM模式创建对话框时,如何实例化对话框并记录用户输入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56785656/

    10-17 01:13