3

我在 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 集成方面的新手。(这是我用来学习这两种技术的个人项目。)

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

4

2 回答 2

7

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

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

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

于 2008-12-07T04:35:18.650 回答
1

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

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

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

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

于 2008-12-07T04:32:35.880 回答