WPF:数据绑定--EditingCollections绑定的编辑集合

EditingCollections绑定的编辑集合

实现效果:
如图中说明
clipboard.png

clipboard.png

实践:

  1. IEditableObject接口的使用
  2. IEditableCollectionView的使用
  3. 对集合的增、删、改编辑行为的应用

代码:
界面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>

编辑按钮代码:

  1. 检查选择项是否为空
  2. 获取集合的可编辑集合视图
  3. 开始指定项的编辑事务
  4. 新建一个编辑窗口,其绑定源为选定项
  5. 窗口返回时,检查确认后进行结束编辑事务并保存挂起的更改。否则还原项的原始值,结束编辑事务
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();
    }
}

添加按钮代码:

  1. 创建一个窗口提示使用者输入新项,窗口绑定源为集合新项 editableCollectionView.AddNew()
  2. 检查窗口返回值,进行对应结束添加事务并保存挂起新项,否则放弃新项
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();
    }
}

移除按钮代码:

  1. 检查选定项、获取可编辑集合视图,检查是否可以移除操作,消息盒提示是否确定移除
  2. 确认后视图移除当前项
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接口代码:

  1. 本示例需要一个结构数据:
  2. 两个数据字段(对前后顺序有要求?)
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

扩展:

  1. IEditableObject 接口:提供提交或回滚对用作数据源的对象所做更改的功能。
  2. 当集合视图实现 IEditableCollectionView 接口时,如果允许更改基础集合,则可以使用 IEditableCollectionView 公开的方法和属性直接更改基础集合,而不用考虑集合的类型。
  3. 类型 ItemCollection、 BindingListCollectionView 和 ListCollectionView 是WPF附带的类型,这些类型继承自 CollectionView。这些类型还将实现 IEditableCollectionView,因此您可以编辑使用这些类型之一的集合。特别是经常会使用 ItemCollection,因为 ItemsControl.Items 属性为 ItemCollection。
  4. 具体内部实现框架待研再给出示例。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值