2017-01-02 1 views
0

Je n'arrive pas à mettre à jour le DataGrid lorsque je supprime des éléments de Mon ObservableCollection. Lorsque je les supprime, les éléments de ObservableCollection qui sont liés au DataGrid sont supprimés correctement mais ils apparaissent toujours dans le DataGrid.Élément non supprimé de DataGrid lors de la suppression de ObservableCollection

Ceci est mon point de vue:

<Grid> 
    <DataGrid x:Name="ContactsList" Margin="20" AutoGenerateColumns="False" IsReadOnly="True" CanUserResizeRows="False" 
       CanUserResizeColumns="True" ColumnWidth="*" ItemsSource="{Binding Contacts, UpdateSourceTrigger=PropertyChanged, diag:PresentationTraceSources.TraceLevel=High}"> 
    </DataGrid> 
</Grid> 

(colonnes sont peuplées dans le code-behind).

C'est moi-modèle:

public class ContactsViewModel : BindableBase 
{ 
    private readonly IRegionManager regionManager; 
    private readonly IEventAggregator eventAggregator; 
    private readonly IConfigurationContactsService contactsService; 

    private readonly DelegateCommand<object> deleteContactCommand; 

    private ObservableCollection<Contact> contactsCollection; 
    private ICollectionView contactsView; 

    public ContactsViewModel(IEventAggregator eventAggregator, IConfigurationContactsService contactsService, IRegionManager regionManager) 
    { 
     this.regionManager = regionManager; 
     this.contactsService = contactsService; 
     this.eventAggregator = eventAggregator; 

     this.deleteContactCommand = new DelegateCommand<object>(this.DeleteContact, this.CanDeleteContact); 

     this.contactsCollection = new ObservableCollection<Contact>(contactsService.GetContacts()); 
     this.contactsView = CollectionViewSource.GetDefaultView(this.contactsCollection); 
    } 

    public ICollectionView ContactsView 
    { 
     get { return this.contactsView; } 
    } 
    public ObservableCollection<Contact> Contacts 
    { 
     get { return this.contactsCollection; } 
    } 

    public ICommand DeleteContactCommand 
    { 
     get { return this.deleteContactCommand; } 
    } 

    private void DeleteContact(object ignore) 
    { 
     IList<Contact> selectedContacts = contactsService.GetSelectedContacts(); 
     foreach (Contact contact in selectedContacts) 
     { 
      if (contact != null) 
      { 
       contactsService.DeleteContact(contact); 
      } 
     } 
     SetProperty<ObservableCollection<Contact>>(ref this.contactsCollection, new ObservableCollection<Contact>(contactsService.GetContacts()), "Contacts"); 
     // After this, the observable collection is updated correctly, but the datagrid does not delete the items. 
    } 
    private bool CanDeleteContact(object ignored) 
    { 
     return contactsService.GetSelectedContacts().Any(); 
    }  
} 

Je ne vois pas où l'erreur est. Quelqu'un peut-il repérer l'erreur? Merci d'avance.

EDIT

Il y a une particularité sur ce point de vue. Il y a une vue principale avec une barre d'outils (où se trouve le bouton de suppression) et une région ContentTab qui contient deux vues: Vue A, Vue B). Le DataGrid est situé dans la vue A, et toutes les vues (A, B et MainView) ont le même viewmodel: ContactsViewModel.

Répondre

0

Pourquoi vous liez-vous à ObservableCollection lorsque vous avez une propriété ICollectionView? Quoi qu'il en soit, cela devrait actualiser la liaison au ObservableCollection:

private void DeleteContact(object ignore) 
{ 
    IList<Contact> selectedContacts = contactsService.GetSelectedContacts(); 
    foreach (Contact contact in selectedContacts) 
    { 
     if (contact != null) 
     { 
      contactsService.DeleteContact(contact); 
     } 
    } 
    contactsCollection = new ObservableCollection<Contact>(contactsService.GetContacts()); 
    this.OnPropertyChanged("Contacts"); 
} 

Si le DataGrid ne soit pas mis à jour, vous devez vérifier que la méthode contactsService.GetContacts() retourne les éléments que vous attendez à revenir.

Modifier: Vous devez également vous assurer que la vue est liée à la même instance du modèle de vue dans lequel la méthode DeleteContact est exécutée. Placez un point d'arrêt dans le constructeur du modèle de vue et assurez-vous qu'il n'est frappé qu'une seule fois. Alors vous savez qu'il n'y a qu'une seule instance créée et que vous vous liez à celle-ci.

+0

La mise à jour n'est toujours pas effectuée et le service contactsService.GetContacts() renvoie exactement les éléments attendus. :/ – chincheta73

+0

Etes-vous sûr que vous liez à la propriété Contacts alors? Si vous définissez un point d'arrêt dans le getter Contacts, est-il frappé lorsque la vue est chargée et après l'exécution de la méthode DeleteContact? – mm8

+0

Il est frappé lorsque la vue est chargée, mais il n'est pas touché après l'exécution de la méthode DeleteContacts. – chincheta73

0

collection Observable implémente déjà INotifyPropertyChanged, vous ne devez pas le faire à nouveau:

public ObservableCollection<Contact> Contacts{ get;} 


private void DeleteContact(object ignore) 
{ 
    IList<Contact> selectedContacts = contactsService.GetSelectedContacts(); 
    foreach (Contact contact in selectedContacts) 
    { 
     if (contact != null) 
     { 
      contactsService.DeleteContact(contact); 
      Contacts.Remove(contact);// HERE IS THE CHANGE 
     } 
    } 
} 

Il vous suffit de supprimer les éléments anciens et ajouter de nouveaux éléments. Pas besoin d'une autre instance.

EDIT:

Pour ajouter de nouveaux éléments, procédez comme suit:

Contacts.Add(newContact); 

EDIT EDIT:

Vous pourriez avoir à modifier votre suppression un peu, essayez cette :

Contacts.Remove(Contacts.FirstOrDefault(c=c.Id == contact.Id)); // HERE IS THE CHANGE 

Je ne sais pas si vous avez une propriété ID dans votre classe de contact, sinon utilisez autre chose pour trouver le bon contact, par exemple. Nom ou Nom

+0

Salut Nawed, j'ai essayé votre suggestion mais même problème. Le contact est supprimé de la collection, mais il n'est pas supprimé du DataGrid. Y a-t-il un problème avec la liaison? Mais je ne peux pas repérer l'erreur. – chincheta73

+0

@ chincheta73, On dirait que vous avez un contactService, et vous supprimez également le contact à partir de là, mais le contact est-il supprimé au contactServer ou aux Contacts? Pouvez-vous confirmer que le contact est supprimé des contacts? –

+0

Je viens de faire un projet de test et j'ai utilisé 'ItemsSource =" {Binding Contacts} "' et cela a fonctionné –