如何为具有“确定/取消”按钮的数据绑定WPF对话框设计后备数据类型?

3
我在Microsoft Sql CE中创建了一个表,用于存储一些数据。我通过SqlMetal生成了ORM,并将数据源引入了我的WPF项目。
我想创建一个简单的WPF表格,通过ORM生成的类来编辑表格记录。我希望这个表格支持典型的“确认/取消”语义。我按照典型方式创建了表格,使用双向数据绑定在相应字段上与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 集成方面的新手。(这是我用来学习两个技术的个人项目。)

我有一些想法,并将它们放在回答中。

2个回答

7

太棒了!这看起来正好解决了我正在寻找的问题。谢谢! - Greg D
是的,我之前找到了那篇文章,并在几个项目中使用它。节省了我大量时间。 - Cameron MacFarland
如果您正在处理一组实体,其中对一个实体所做的更改不必立即导致另一个实体发生更改(在调用EndEdit之前),则此方法适用。假设您在同一表单中有订单和订单项。如果您需要更新订单上的客户,并且每个订单项都需要根据客户的某个值(折扣代码)进行费率折扣,则在调用Order.EditEdit(通常在表单上的保存按钮上)之前,订单项将不会更新其总计。因此,用户在更改客户时将看不到订单总额立即更改的反馈。 - Dasith Wijes

1

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

代码(未编译)可能如下所示:

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

我不确定我是否喜欢像那样往返于数据库。


http://groups.google.com.au/group/wpf-disciples/web/wpf-and-xaml-coding-guidelines 包含一些有用的指南,包括我在问题中执行的DataContext分配的更好技术。 - Greg D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接