博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Silverlight自定义数据绑定控件应该如何处理IEditableObject和IEditableCollectionView对象...
阅读量:6719 次
发布时间:2019-06-25

本文共 3308 字,大约阅读时间需要 11 分钟。

最近在一直研究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模式就可以实现这个对象。

2.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方法。

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

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为例,自定义控件类似。

 

本文转自 powertoolsteam 51CTO博客,原文链接:http://blog.51cto.com/powertoolsteam/443155,如需转载请自行联系原作者

你可能感兴趣的文章
【模板】杜教筛(Sum)
查看>>
9月5 号作业管理信息系统
查看>>
a标签中有img有时候会把a撑过大
查看>>
数据库分库分表思路
查看>>
查看 FormData 中已存在的值
查看>>
shell浅谈之三for、while、until循环【转】
查看>>
嵌入式Linux下Camera编程--V4L2【转】
查看>>
算法(Algorithms)第4版 练习 1.3.25 1.3.24
查看>>
(三)Controller接口控制器详解(一)
查看>>
0328复利软件4.0测试
查看>>
git 回滚操作
查看>>
背包问题初探
查看>>
野生前端的数据结构基础练习(4)——字典
查看>>
***UML类图几种关系的总结
查看>>
【BZOJ 1056 1862】排名系统
查看>>
AI入门丨开源学习资源推荐
查看>>
观书有感(摘自12期CSDN)
查看>>
UWP VirtualizedVariableSizedGridView 支持可虚拟化可变大小Item的View(一)
查看>>
shell脚本中的整数测试
查看>>
Struts2工作流程
查看>>