Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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
在wpf中构建数据输入表单_Wpf - Fatal编程技术网

在wpf中构建数据输入表单

在wpf中构建数据输入表单,wpf,Wpf,我正试图在wpf中构建一个数据输入表单。要执行验证,我显然需要在网格的datacontext中附加一个对象。但是当我还没有创建一个的时候,我怎么能有一个呢 它是如何工作的 例如,我有一个带有datagrid的屏幕。datagrid包含从成员资格获得的用户。网格上方有一个按钮:添加用户。单击后,将出现一个新窗口,可以输入以下内容:用户名、密码、电子邮件。对文本框执行验证以查看它们是否为空。现在,据我所知,其工作方式是将一个对象附加到窗口(datagrid datacontext)。但是,当它还不存

我正试图在wpf中构建一个数据输入表单。要执行验证,我显然需要在网格的datacontext中附加一个对象。但是当我还没有创建一个的时候,我怎么能有一个呢

它是如何工作的


例如,我有一个带有datagrid的屏幕。datagrid包含从成员资格获得的用户。网格上方有一个按钮:添加用户。单击后,将出现一个新窗口,可以输入以下内容:用户名、密码、电子邮件。对文本框执行验证以查看它们是否为空。现在,据我所知,其工作方式是将一个对象附加到窗口(datagrid datacontext)。但是,当它还不存在时,我怎么能让它附加呢?

这里的想法是,您应该附加一个与您的业务模型稍有不同的对象。在您的情况下,它不会
UserInfo
(或者您为网格中的用户提供的任何信息)。它将是另一个类,更适合编辑。在
MVVM
中,该类将成为
ViewModel
。与常规用户类相比,该类将有一些不同,例如,它可能有一些属性可为null(当您尚未设置它们时)。这个类还将处理验证。您应该在创建编辑器窗口的同时实例化该类,并将该类的实例放入
window.DataContext

Hmm,这个问题有很多,但我刚刚创建了一个包含三个数据网格的屏幕(在本例中我使用的是Telerik),每个数据网格下都有一个添加到网格的按钮。不,有三个数据网格的窗口有自己的视图模型。每个“弹出窗口”都有自己的viewmodel,在本例中,所有这些都是用户控件,我只需创建一个新窗口并设置window.content和调用show对话框

通信是通过“事件”来实现的——不是您在.NET中使用的标准事件,但在本例中,我使用的是Prism及其CompositePresentationEvent类。当用户创建完他们的新对象后,他们单击add,我触发这个事件,“负载”就是他们创建的对象。带有三个网格的主窗口侦听该事件,并有一个方法来处理它,在本例中,将其添加到ObservableCollection,这就是我绑定网格的地方


如果我是你,我会研究各种各样的框架,Prism,MVVM light等等。。。同样,你的问题似乎相当宽泛,我试图给出一个概述,但我没有详细说明,如果你研究某种框架,我想它会为你澄清很多细节

当用户点击Add New时,创建对象的新空白副本,并将datacontext设置为该新对象

设置某种标志以标识它是新对象。这可以是Id为NULL、0、-1等,也可以是设置为New的ObjectState属性。这样所有的验证规则都适用,一旦用户点击save,您就知道要插入而不是更新,这是一个非常有用的例子

每个WPF视图都有一个视图中的属性绑定到的对应视图模型对象。因此,带有数据网格的窗口有一个视图模型,即它的
DataContext
,视图模型的属性绑定到视图中的属性,例如,数据网格中的
ItemsSource
绑定到一个集合(见注1)

“添加用户”命令(在窗口的视图模型中作为
RelayCommand
实现)创建一个新视图(新窗口)及其相应的视图模型对象(新用户),将视图的
DataContext
设置为视图模型,并调用
ShowDialog
显示窗口。(请参见注释2。)如果用户接受新对象,
ShowDialog
返回true,命令中的逻辑将获取视图模型对象(现在包含用户所做的任何更改),并使用其中的信息创建新模型对象并将其添加到模型中。如果用户取消此操作,
ShowDialog
将返回false,并且该命令将放弃视图模型对象,而不创建新的模型对象

注意1:此处的集合可能是模型对象的集合,也可能是视图模型对象的集合。这取决于是否需要模型中没有的任何内容来显示数据网格中的模型对象。在这种情况下,网格中的对象作为对话框的视图模型是很常见的,也就是说,视图模型对象具有实现用于在网格中显示和在对话框窗口中修改的属性。另一方面,如果网格所做的一切都是显示来自模型的数据,则可能不需要中间对象


注意2:让命令创建WPF窗口违反了MVVM的中心设计原则,即视图模型不应创建WPF对象。这个原则的原因很简单:您不能为这个命令构建一个自动化的单元测试,因为它只会弹出一个对话框并等待。有各种不同的方法可以实现这一点,例如,请参见和,所有这些方法都涉及到将实际对话框窗口的创建和显示委托给一个单独的服务,该服务可以模拟出来进行单元测试。如果您不想预先选择这些方法中的一种,您可以在这项工作正常后将其改装到应用程序中。

好的,也许我应该用不同的方式来表述:单击“添加”按钮,弹出一个新窗口,您可以在其中输入例如新用户、的数据上下文(例如)新窗口中包含这些字段的网格应该绑定到要填充字段的对象,对吗?实际上,我只是想知道我的假设是否正确,即在填写表单时,应该将空对象绑定到窗口。哦,比方说新产品或用户。啊哈。这很有趣!