2013-06-29 3 views
0

J'ai une source de données ListView avec une ObservableCollection (Of T), où "T" est une entité de EF. Pour ajouter/modifier un élément, utilisez IEditableCollectionView. Cela fonctionne parfaitement. Le problème est l'annulation de l'action pour modifier un élément existant.IEditableCollectionView & EntityFramework

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 

La méthode "editableCollectionView.CancelEdit()", l'exception suivante est lancée: "CancelEdit pas pris en charge pour l'élément de montage actuel." J'ai essayé de voir ce qui me donne la propriété "CanCancelEdit" et est "Faux".

Merci.

+0

Quelle est la classe qui implémente IEditableCollectionView? Est-ce le vôtre? – Crono

Répondre

0

Vous devez appeler CanCancelEdit() pour vérifier que vous pouvez annuler().

Pour faire ce travail, les objets de la collection doivent mettre en œuvre IEditableObject: il est un exemple de la façon de faire que cela se produise à http://msdn.microsoft.com/en-us/library/system.componentmodel.ieditableobject(v=vs.110).aspx

IEditableObject est principalement utilisé pour DataGridRows.

Dans ce cas particulier, lorsque vous modifiez un élément et que vous l'annulez peut-être, ne modifiez pas CancelEdit. Créez une classe ViewModel et affichez-la dans la boîte de dialogue. Si, et seulement si, l'utilisateur clique sur OK, recopiez les valeurs.

Votre CarViewModel a besoin de mettre en œuvre INotifyPropertyChanged pour de meilleurs résultats dans la liaison dans la boîte de dialogue ...

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