EditingCollections绑定的编辑集合
实现效果:
如图中说明
实践:
- IEditableObject接口的使用
- IEditableCollectionView的使用
- 对集合的增、删、改编辑行为的应用
代码:
界面xaml
<ListView Name="itemsControl" ItemsSource="{StaticResource MyData}">
<ListView.View>
<GridView>
<GridViewColumn Header="Item"
DisplayMemberBinding="{Binding Path=Description}"/>
<GridViewColumn Header="Price"
DisplayMemberBinding="{Binding Path=Price, StringFormat=c}"/>
</GridView>
</ListView.View>
</ListView>
编辑按钮代码:
- 检查选择项是否为空
- 获取集合的可编辑集合视图
- 开始指定项的编辑事务
- 新建一个编辑窗口,其绑定源为选定项
- 窗口返回时,检查确认后进行结束编辑事务并保存挂起的更改。否则还原项的原始值,结束编辑事务
private void Edit_Click(object sender, RoutedEventArgs e)
{
if (itemsControl.SelectedItem == null)
{
MessageBox.Show("No item is selected");
return;
}
var editableCollectionView =
itemsControl.Items as IEditableCollectionView;
// Create a window that prompts the user to edit an item.
var win = new ChangeItem();
editableCollectionView.EditItem(itemsControl.SelectedItem);
win.DataContext = itemsControl.SelectedItem;
// If the user submits the new item, commit the changes.
// If the user cancels the edits, discard the changes.
if ((bool) win.ShowDialog())
{
editableCollectionView.CommitEdit();
}
else
{
editableCollectionView.CancelEdit();
}
}
添加按钮代码:
- 创建一个窗口提示使用者输入新项,窗口绑定源为集合新项 editableCollectionView.AddNew()
- 检查窗口返回值,进行对应结束添加事务并保存挂起新项,否则放弃新项
private void Add_Click(object sender, RoutedEventArgs e)
{
var editableCollectionView = itemsControl.Items as IEditableCollectionView;
if (!editableCollectionView.CanAddNew)
{
MessageBox.Show("You cannot add items to the list.");
return;
}
// Create a window that prompts the user to enter a new
// item to sell.
var win = new ChangeItem {DataContext = editableCollectionView.AddNew()};
//Create a new item to be added to the collection.
// If the user submits the new item, commit the new
// object to the collection. If the user cancels
// adding the new item, discard the new item.
if ((bool) win.ShowDialog())
{
editableCollectionView.CommitNew();
}
else
{
editableCollectionView.CancelNew();
}
}
移除按钮代码:
- 检查选定项、获取可编辑集合视图,检查是否可以移除操作,消息盒提示是否确定移除
- 确认后视图移除当前项
private void Remove_Click(object sender, RoutedEventArgs e)
{
var item = itemsControl.SelectedItem as PurchaseItem;
if (item == null)
{
MessageBox.Show("No Item is selected");
return;
}
var editableCollectionView =
itemsControl.Items as IEditableCollectionView;
if (!editableCollectionView.CanRemove)
{
MessageBox.Show("You cannot remove items from the list.");
return;
}
if (MessageBox.Show("Are you sure you want to remove " + item.Description,
"Remove Item", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
{
editableCollectionView.Remove(itemsControl.SelectedItem);
}
}
IEditableObject接口代码:
- 本示例需要一个结构数据:
- 两个数据字段(对前后顺序有要求?)
private struct ItemData
{
internal string Description;
internal DateTime OfferExpires;
internal double Price;
}
private ItemData _copyData;
private ItemData _currentData;
#region IEditableObject Members
public void BeginEdit()
{
_copyData = _currentData;
}
public void CancelEdit()
{
_currentData = _copyData;
NotifyPropertyChanged("");
}
public void EndEdit()
{
_copyData = new ItemData();
}
#endregion
扩展:
- IEditableObject 接口:提供提交或回滚对用作数据源的对象所做更改的功能。
- 当集合视图实现 IEditableCollectionView 接口时,如果允许更改基础集合,则可以使用 IEditableCollectionView 公开的方法和属性直接更改基础集合,而不用考虑集合的类型。
- 类型 ItemCollection、 BindingListCollectionView 和 ListCollectionView 是WPF附带的类型,这些类型继承自 CollectionView。这些类型还将实现 IEditableCollectionView,因此您可以编辑使用这些类型之一的集合。特别是经常会使用 ItemCollection,因为 ItemsControl.Items 属性为 ItemCollection。
- 具体内部实现框架待研再给出示例。。。