如何以编程方式检测DataFrame是否处于编辑模式

时间:2010-10-04 16:10:04

标签: silverlight silverlight-4.0 wcf-ria-services dataform

我在Silverlight 4中使用DataForm。实际上,有几个DataForms,它们共享一个共同的RIA Services上下文。这是我遇到的问题......

如果我开始在其中一个DataForms中编辑DataField,然后单击一个调用Context.SubmitChanges()的按钮,我收到以下错误:

�Entity 'foo' is currently being edited and has uncommitted changes. 
  A call to BeginEdit must be followed by a call to EndEdit or CancelEdit 
  before changes can be submitted.� 

请注意,“提交更改”按钮位于DataForms的外部,并应用于DataForms之间共享的RIA Services上下文(每个DataForms位于选项卡控件的单独选项卡中)。

我希望能够通过在代码中检测DataForm何时处于编辑模式来避免此问题。当我处于调试模式时,我可以看到DataForm具有IsEditingCanCancelEdit等属性,表明它处于编辑模式,但这些属性似乎不可用于我的代码。

有什么想法吗?

5 个答案:

答案 0 :(得分:3)

您可以在调用DomainContext.SubmitChanges()之前调用DataForm.CommitEdit()并完全避免错误。

答案 1 :(得分:3)

我在调用SubmitChanges()之前在我的数据网格上使用了CommitEdit方法(在DataForm上应该是相同的),以便用一行代码修复问题。

myDataGrid.CommitEdit(DataGridEditingUnit.Row, true);

答案 2 :(得分:1)

我不确定IsEditingCanCancelEdit是什么,但没有记录。

但是Mode属性DataFormMode枚举,ReadOnlyEditAddNew。还有一个IsItemChanged属性,指示是否已进行任何实际更改。

答案 3 :(得分:0)

由于没有可用的属性提供了我需要的信息,我最终创建了自己的私有字段(在包含DataForm的UserControl中),名为_isEditing,初始化为“false”。在DataForm.BeginningEdit事件处理程序中,我将其设置为“true”,并在DataForm.EditEnded事件处理程序中将其设置为“false”。然后,我创建了一个名为IsEditing的只读公共属性,以使值在外部可用。

答案 4 :(得分:0)

我刚刚用这段代码来解决我遇到的问题。当单击“保存”按钮时,它位于我的代码隐藏中:

        bool editresult = true;
        this.FindChildrenByType<DataGrid>().ToList().ForEach(grid =>
        {
            editresult = editresult && grid.CommitEdit(DataGridEditingUnit.Row, true) && grid.IsValid;
        });

        if (!editresult)
        {
            _messager.Alert("There is a problem with one of the items shown on the screen. This will usually be highlighted in red.\r\nPlease correct the item(s) and try saving again.");
        }
        else
        {
            // Save changes
        }

DataGrid.CommitEdit(DataGridEditingUnit.Row,true)告诉datagrid提交行,最后一个boolean告诉网格退出编辑模式。这将返回true或false,具体取决于该行是否应该退出编辑模式。通常在您正在编辑行的网格中存在验证错误,网格将不允许您通过单击另一个项目退出编辑模式,但此调用将允许退出但返回false。 DataGrid.IsValid检查网格中的所有项目以查看它们是否有效。