我是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个
我的问题是,现在如何从我的类A 实例化新对话框,以便使用传递给对话框的参数以与以前相同的方式填充数据,并记录用户选择而不会丢失任何数据并安全地关闭 View 。
最佳答案
标准MVVM方法的工作方式如下(至少在使用MVVM Light时):
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); }
}
}
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>
DataContext
,而没有在View层中编写一行C#代码。从在Binding
表达式和其他地方都获得所有设计时Intellisense的意义上来说,这也很优雅。 <TextBox Text="{Binding Name}" />
其余的东西在C++中:
ShowDialog()
将其显示在屏幕上。 DataContext
属性,该属性是DialogVM
类的对象。您可以从中访问用户提供的值,因为绑定(bind)已在VM中为您更新了这些属性。 关于c# - 在WPF中使用MVVM模式创建对话框时,如何实例化对话框并记录用户输入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56785656/