在wpf中构建数据输入表单

时间:2011-03-18 12:21:25

标签: wpf

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

它是如何运作的?

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

4 个答案:

答案 0 :(得分:2)

这是MVVM design patterns非常有用的情况。

每个WPF视图都有一个对应的视图模型对象,视图中的属性绑定到该对象。因此,具有数据网格的窗口具有视图模型 - 其DataContext - 并且视图模型具有绑定到视图中的属性的属性 - 例如数据网格中的ItemsSource绑定到集合(参见注释1)。

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

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

注2:让命令创建WPF窗口违反了中央MVVM设计原则,即视图模型不应创建WPF对象。这个原理的原因很简单:你不能为这个命令构建一个自动单元测试,因为它只是抛出一个对话框并等待。有各种不同的方法 - 例如,参见this questionJosh Smith's blog post on the Mediator pattern - 所有这些方法都涉及将实际对话窗口的创建和显示委托给可以是单独的服务。嘲笑单位测试。如果您不想事先选择其中一种方法,那么一旦您开始工作,您就可以将其中的一种方法改装到您的应用程序中。

答案 1 :(得分:0)

这里的想法是你应该附加一个与你的商业模式略有不同的对象。在您的情况下,它不会UserInfo(或网格中用户的任何内容)。它将是其他一些类,更适合编辑。在MVVM中,此类将为ViewModel。与常规用户类相比,此类会有一些差异,例如,它可能有一些属性可以为空(当您尚未设置它们时)。此类也将处理验证。您应该在创建编辑器窗口的同时实例化此类,并将此类的实例放入Window.DataContext

答案 2 :(得分:0)

嗯,这个问题有很多,但我刚创建了一个带有三个数据网格的屏幕(在这种情况下我使用的是Telerik),每个数据网格下面都有一个添加到网格的按钮。没有具有三个数据网格的窗口具有它自己的视图模型。每个“弹出窗口”都有自己的视图模型,在这种情况下,所有这些都是用户控件,我只需创建一个新窗口并设置window.content并调用show dialog。

通过“事件”促进通信 - 不是您在.NET中习惯的标准事件,但在这种情况下,我使用的是Prism,它是CompositePresentationEvent类。当用户完成创建新对象后,他们单击添加并触发此事件,其中“payload”是他们创建的对象。具有三个网格的主窗口侦听该事件并具有处理它的方法,在这种情况下将其添加到ObservableCollection,这是我将网格绑定到的。

如果我是你,我会调查那里的各种框架,Prism,MVVM light等......再次,你的问题似乎相当广泛,我试图给出一个概述,但我没有详细说明,如果你研究某种框架,我认为它会为你清理很多这些细节。

答案 3 :(得分:0)

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

设置某种标志以识别它是一个新对象。这可以是Id为NULL,0,-1等,或者ObjectState属性设置为New。这样,所有验证规则都适用,一旦用户点击保存,您就会知道INSERT而不是UPDATE