如何为带有确定/取消按钮的数据绑定 WPF 对话框设计支持数据类型?

Posted

技术标签:

【中文标题】如何为带有确定/取消按钮的数据绑定 WPF 对话框设计支持数据类型?【英文标题】:How do I design backing data types for a databound WPF dialog with Ok/Cancel buttons? 【发布时间】:2008-12-07 04:25:56 【问题描述】:

我在 Microsoft Sql CE 中创建了一个用于保存一些数据的表。我已经通过 SqlMetal 生成了一个 ORM,并将数据源拉到了我的 WPF 项目中。

我想创建一个简单的 WPF 表单,该表单可用于通过 ORM 生成的类编辑表中的记录。我希望这个表单支持典型的 OK/Cancel 语义。我以我认为是典型的方式创建了表单,在各个字段上使用 TwoWay 数据绑定来绑定来自 ORM 的对象实例。例如,给定 ORM 中具有属性“TaskName”的对象,我在 WPF 表单中包含以下内容:

<Label Grid.Column="0" Grid.Row="0" >
    Name:
</Label>
<TextBox Name="txtName" Grid.Column="1" Grid.Row="0" 
         Text="Binding TaskName, Mode=TwoWay" AcceptsReturn="False"
         MaxLines="1" />

这个,结合代码中的 DataContext 赋值:

var newRow = new OrmGeneratedClass();
// Populate default values on newRow, e.g.    
detailWindow.DataContext = newRow;
detailWindow.ShowDialog();

可以很好地创建新行。通过表单所做的所有更改都会立即反映在底层 OrmGeneratedClass 中。问题是,如果 OrmGeneratedClass 填充了以前保存的值,则无法立即支持取消更改。

什么是这个场景的好设计,还是在我到达这一点之前我设计错了?我是 WPF 和 Sql Server 数据源/ORM 集成方面的新手。 (这是我用来学习这两种技术的个人项目。)

我有几个想法,并将它们放在答案中

【问题讨论】:

【参考方案1】:

Paul Stovell 有一篇关于为 IEditableObject 接口创建适配器的精彩文章,该接口允许您进行数据绑定并允许应用/恢复行为。

http://www.paulstovell.com/blog/runtime-ui-binding-behavior-ieditableobject-adapter

适配器环绕您的 ORM 对象并自动缓存更改,以便您可以应用更改或恢复到原始状态。

【讨论】:

太棒了!这看起来就像它完全解决了我正在寻找的东西。谢谢! 是的,我不久前找到了这篇文章,并在几个项目中使用了它。为我节省了大量时间。 如果您正在使用一组实体,对这些实体所做的更改不必导致另一个更改(在调用 EndEdit 之前),则此方法有效。假设您有相同形式的 Orders 和 OrderItems。如果您需要更新订单上的客户,并且每个订单商品需要根据客户的某些价值(折扣代码)进行折扣率,那么订单商品在 Order.EditEdit 之前不会更新它们的总数(通常在保存按钮上形式)被调用。所以用户在更改客户时不会看到 order_total 更改的即时反馈。【参考方案2】:

一种可能的解决方案是从对话框中查找取消结果,并使用 ORM 对象的主键,在用户每次取消时从数据库中检索数据,以验证对象是否包含它在数据库中的值.这假定该值的最近确认值已存储在数据库中。 (在这样简单的程序中,这可能是一个公平的假设。)

它可能看起来像这样(非编译)代码:

var existingRow = GetExistingRow(someConditionOrWhatever);
detailWindow.DataContext = existingRow;
if(!detailWindow.ShowDialog())

    existingRow = GetExistingRow(someConditionOrWhatever);

不过,我不知道我是否喜欢这样往返于数据库。

【讨论】:

groups.google.com.au/group/wpf-disciples/web/… 包括一些有用的指南,包括我在问题中执行的 DataContext 分配的更好技术。

以上是关于如何为带有确定/取消按钮的数据绑定 WPF 对话框设计支持数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何不丢失绑定源更新?

如何用JS弹出“有输入框并带有是、否、取消按钮”的对话框。

JavaScript中三种弹出式消息提醒的命令是啥?(如:警告,确认,信息输入)

如何为 WPF 中的工具栏按钮创建热键?

细节(01):confirm使用

如何为所有 PickerViews 创建单个完成和取消按钮?