0

我有一个带有 ObservableCollection (Of T) 的 ListView 数据源,其中“T”是 EF 的一个实体。要添加/编辑项目,请使用 IEditableCollectionView。它完美地工作。问题是取消修改现有项目的操作。

Private Sub edit_Click(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles ListBoxMain.MouseDoubleClick

   If ListBoxMain.SelectedItem Is Nothing Then
        MessageBox.Show("No item is selected")
        Return
    End If

    Dim editableCollectionView As IEditableCollectionView = TryCast(ListBoxMain.Items, IEditableCollectionView)

    Dim win As New ChangeItemWindow()
    editableCollectionView.EditItem(ListBoxMain.SelectedItem)
    win.DataContext = ListBoxMain.SelectedItem

    If CBool(win.ShowDialog()) Then
        editableCollectionView.CommitEdit()
    Else
        editableCollectionView.CancelEdit()
    End If

End Sub

方法“editableCollectionView.CancelEdit()”,抛出以下异常:“当前编辑元素不支持CancelEdit。” 我试图看看是什么给了我属性“CanCancelEdit”并且是“False”。

谢谢你。

4

1 回答 1

0

你应该调用 CanCancelEdit() 来检查你是否可以 CancelEdit()。

为了使这项工作,集合中的对象需要实现 IEditableObject:在http://msdn.microsoft.com/en-us/library/system.componentmodel.ieditableobject(v= vs.110).aspx

IEditableObject 主要用于 DataGridRows。

在这种特殊情况下,当您正在编辑一个项目并可能取消时,不要乱用 CancelEdit。创建一个 ViewModel 类并在对话框中显示它。当且仅当用户单击确定然后将值复制回来。

您的 CarViewModel 需要实现 INotifyPropertyChanged 以获得在对话框中绑定的最佳结果...

dim car = ListBoxMain.SelectedItem as Car;
dim carVM as new CarViewModel
carVm.Make = car.Make
carVM.Color=car.Color}
dim win as new ChangeItemWindow()
win.DataContext = carVM
if win.ShowDialog() then
    car.Make = carVM.Make
    car.Color = carVM.Color
end if
于 2013-12-08T18:46:46.440 回答