我有一个带有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"是"错误。"
谢谢。
答案 0 :(得分: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