Silverlight自定义数据绑定控件应该如何处理IEditableObject和IEditableCollectionView对象

最近在一直研究Silverlight下的数据绑定控件,发现有这样两个接口IEditableObject 和IEditableCollectionView,记录一下结论,欢迎交流指正。

本文会重点介绍在构建Silverlight自定义数据绑定控件的过程中,我们会对数据源进行操作,那么就会碰到上述两个接口,如何正确的处理它们。

 

  1. IEditableObject

这个概念早在.Net 1.0的时候就提出了,但是我一直没有关注过这个东东。

What is IEditableObject?

IEditableObject is used to represent an object that has an editing mode and the ability to commit or revert changes.

UseCase:When a validation error occurs in a cell, user can back out of changes using Escape key. However if user has made changes to other columns in same row, those changes will still persists.User may wish to back out of all changes. This is where IEditableObject interface comes into play. IEditableObject is used to represent an object that has an editing mode and the ability to commit or revert changes.

Definition:

public interface IEditableObject
{
    void BeginEdit();
    void CancelEdit();
    void EndEdit();
}

 

简单来说IEditableObject就是具有编辑模式,并且支持整体提交和回滚值的对象。比如一个数据行对象,你可以更改其多个列的值,在没有提交者前,都可以通过CancelEdit进行回滚。

通过一个简单的Memo模式就可以实现这个对象。

 

  1. IEditableCollectionView

 

这个概念是在WPF3.5 SP1的时候才引入,目的是提供一个具有事务能力的集合类。

IEditableCollectionView is a new collection view that you can use to supports adding and removing new items, as well as editing items in a transactional way. It is implemented by ListCollectionView (the default view for ObservableCollection) and BindingListCollectionView (the default view for DataTable).

Definition:

public interface IEditableCollectionView
{
    bool CanAddNew { get; }
    bool CanCancelEdit { get; }
    bool CanRemove { get; }
    object CurrentAddItem { get; }
    object CurrentEditItem { get; }
    bool IsAddingNew { get; }
    bool IsEditingItem { get; }
    NewItemPlaceholderPosition NewItemPlaceholderPosition { get; set; }

    object AddNew();
    void CancelEdit();
    void CancelNew();
    void CommitEdit();
    void CommitNew();
    void EditItem(object item);
    void Remove(object item);
    void RemoveAt(int index);
}

 

这两个接口的关系:

When the data Item implements IEditableObject, the IEditableCollectionView will call BeginEdit() when a new item is added or an existing item is opened for edit. It will call CancelEdit() when the item is cancelled and EndEdit() when the item is committed. IEditableCollectionView lets the app author handle this part of the transaction.

换句话说就是,如果IEditableCollectionView发现其Item实现了IEditableObject接口,会在它的EditItem,CommitEdit以及CancelEdit方法中调用子Item的BeginEdit,EndEdit和CancelEdit方法。

 

  1. 自定义数据绑定控件应该如何处理这两个接口

IEditableObject

如果数据绑定控件发现当前行绑定的对象是IEditableObject,那么在该行上如果有一个Cell进入编辑状态,并且是第一个单元格的时候,就需要调用绑定对象的BeginEdit方法。

当某一行上某一个Cell处于编辑状态的时候,Press Esc,该Cell会退出编辑状态,值也会回滚。注意这个时候不会调用IEditableObject的CancelEdit方法,这是Cell本身应该提供的行为。这个时候IsEdit为False,但是Row拥有焦点,继续Press Esc,会调用IEditableObject的CancelEdit方法,你会发现其他列的值也会回滚。

当某一行上某一个Cell处于编辑状态的时候,鼠标点击其他行,该Cell会退出编辑状态。只是会调用IEditableObject的EndEdit方法。

 

IEditableCollectionView

对于IEditableCollectionView来说,EditItem,CommitEdit还有CancelEdit方法分别对应着IEditableObject接口的BeginEdit,EndEdit和CancelEdit,调用时机完全一样。

数据绑定控件如果其数据源是IEditableCollectionView, 在处理BeginEdit,EndEdit和CancelEdit的时候应该直接调用CollectionView的相应方法,这个时候就不需要在处理 IEditableObject接口了,IEditableCollectionView内部会调用该接口。

只有在其数据源不是IEditableCollectionView的时候,如果Row绑定对象是IEditableObject,需要调用IEditableObject的接口实现。

这样的话,自定义数据绑定控件就可以完美支持这两个接口了。

说明:以上描述是以Silverlight DataGrid为例,自定义控件类似。

 

 

作者:Ted    葡萄城资深架构师,控件产品专家
时间: 2024-09-23 04:13:05

Silverlight自定义数据绑定控件应该如何处理IEditableObject和IEditableCollectionView对象的相关文章

ASP.NET 2.0 和数据绑定控件:新的角度,新的做法

asp.net|控件|数据 适用于:Microsoft ASP.NET 1.xMicrosoft ASP.NET 2.0 摘要:了解 ASP.NET 2.0 中的用于生成自定义数据绑定控件的工具是如何演变的.   本页内容 为什么需要新的数据源模型  ASP.NET 2.0 中的数据绑定控件  分析要点  数据绑定机制   列表控件  HeadlineList 示例控件  管理自定义集合  关于复合控件的一点讨论  小结 为什么需要新的数据源模型数据绑定是开发人员在 ASP.NET 1.x 中发

在silverlight里自定义一个控件,在自定义控件类里面定义依赖属性出错。

问题描述 在silverlight里自定义一个控件,在自定义控件类里面定义依赖属性出错. 在silverlight里自定义一个控件ReplicationEventComboBox继承ComboBox,在ReplicationEventComboBox类里面定义依赖属性TextProperty. 其中ReplicationEventComboBox中 private TextBlock _text; 字段在方法OnApplyTemplate()中被赋值 var text = this.GetTem

[转]利用ASP.NET 2.0创建自定义Web控件(2)

原址:http://hi.baidu.com/sjbh/blog/item/5a8298454403a321cffca39c.html   如何生成的? Render() 方法基本上控制着 WebControl 的整个输出.默认情况下,Render() 方法实际上会依次调用 RenderBeginTag().RenderContents() 以及 RenderEndTag().尽管在 ASP.NET 1.x 中调用结构并未变化,但由于该呈现模型,修改这些调用的影响却发生了变化. 您可以覆盖 Re

详细阐述利用ASP.NET 2.0创建自定义Web控件开发说明

asp.net|web|创建|控件|控件开发 简介 从使用基本的文本编辑器到创作标记页面,Web 开发已经经历了一个漫长的过程.目前,集成开发环境 (IDE) 为开发过程中的几乎每个方面都提供了图形化表示形式.此外,还实现各种说明性编程技术以提高效率并降低出现错误的几率.Visual Studio 2005 和 ASP.NET 2.0 中的控件体系结构遵循了这些编程趋势,并且提供了可靠的.可扩展的环境,该环境设计为使开发人员可以创建能够以说明方式配置的控件. 此外,ASP.NET 中新的自适应呈

利用 ASP.NET 2.0 创建自定义 Web 控件

asp.net|web|创建|控件 Jayesh Patel.Bryan Acker.Robert McGovernInfusion Development适用于:Microsoft ASP.NET 2.0Microsoft Visual Studio 2005 摘要:ASP.NET 2.0 中新的自适应呈现模型为控件编写人员提供了很多新的选项.本文展示了这些选项如何使创建 ASP.NET 的自定义控件变得比以前更加容易. 本页内容 简介 自适应呈现模型 创建自定义服务器控件 TagKey 使用

利用ASP.NET 2.0创建自定义Web控件

asp.net|web|创建|控件 从使用基本的文本编辑器到创作标记页面,Web 开发已经经历了一个漫长的过程.目前,集成开发环境 (IDE) 为开发过程中的几乎每个方面都提供了图形化表示形式.此外,还实现各种说明性编程技术以提高效率并降低出现错误的几率.Visual Studio 2005 和 ASP.NET 2.0 中的控件体系结构遵循了这些编程趋势,并且提供了可靠的.可扩展的环境,该环境设计为使开发人员可以创建能够以说明方式配置的控件. 此外,ASP.NET 中新的自适应呈现模型减少了编写

绑定Enum到ASP.NET数据绑定控件的完美解决方案

本文向读者介绍NBear中实现的DropDownListField字段绑定控件和EnumDescriptionAttribute特性.结合使用这两个组件,就可以最简单.易用和可扩展地完美解决绑定Enum到ASP.NET数据绑定控件的问题.[05/26修订]--增加支持第三方枚举描述,支持二进制与过的枚举值. 从DropDownListField的名称,大家一定猜到了,是的,DropDownListField控件和ASP.NET内置的BoundField,CheckBoxField等一样,可以直接

asp.net学习之数据绑定控件、数据源控件概述

原文:asp.net学习之数据绑定控件.数据源控件概述 1.asp.net数据绑定控件分为三大类,每个类分别进行详细:      ● 列表式数据绑定控件: 列表式数据绑定控件常用来在一个表格内的一个字段进行绑定.显示一个字段下所有数据的信息.           它包括以下几个控件:BulletedList.CheckboxList.DropDownList.ListBox.RadioButtonList           具体的参照以下文章:  http://www.cnblogs.com/

浅谈ASP.NET常用数据绑定控件优劣总结_实用技巧

本文的初衷在于对Asp.net常用数据绑定控件进行一个概览性的总结,主要分析各种数据绑定控件各自的优缺点,以便在实际的开发中选用合适的控件进行数据绑定,以提高开发效率. 因为这些数据绑定控件大部分都已经封装的很好了,稍微有一些基础的朋友都可以很容易的上手使用,所以本文不涉及具体控件的使用,只在于分析各自的优劣点,但是在下一篇文章里,我会主要讲一下ListBox.GridView.Repeater这三个数据绑定控件的"高效分页",ListBox和GridView内置的有分页,但是其效率太