2017-01-02 5 views
0

Я пытаюсь обновить datagrid при удалении элементов из моего ObservableCollection. Когда я их удаляю, элементы в ObservableCollection, привязанные к DataGrid, удаляются правильно, но они все еще отображаются в DataGrid.Элемент, который не удаляется из DataGrid при удалении из ObservableCollection

Это мое мнение:

<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> 

(столбцы заполняются в коде-позади).

Это мое мнение-модель:

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(); 
    }  
} 

Я не могу видеть, где ошибка. Может ли кто-нибудь обнаружить ошибку? Заранее спасибо.

EDIT

Существует одна особенность этой точки зрения. Существует Основной вид с панелью инструментов (где кнопка удаления) и область ContentTab, которая содержит два вида: View A, View B). DataGrid находится в представлении A, и все представления th (A, B и MainView) имеют одну и ту же модель просмотра: ContactsViewModel.

ответ

0

Почему вы привязываетесь к ObservableCollection, когда у вас есть свойство ICollectionView ?. Во всяком случае, это должно обновить связывание с 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"); 
} 

Если DataGrid не обновляется вы должны убедиться, что contactsService.GetContacts() метод возвращает элементы, которые вы ожидаете его вернуть.

Редактировать: Вы также должны убедиться, что представление привязывается к тому же экземпляру модели представления, в которой выполняется метод DeleteContact. Поместите контрольную точку в конструктор модели представления и убедитесь, что она попадает только один раз. Тогда вы знаете, что существует только один экземпляр, созданный и связанный с этим.

+0

Все еще не обновляется, а контактыService.GetContacts() возвращает именно те элементы, которые я ожидаю. :/ – chincheta73

+0

Вы уверены, что привязываетесь к свойству "Контакты"? Если вы установите контрольную точку в приемнике контактов, будет ли она ударяться при загрузке представления и после выполнения метода DeleteContact? – mm8

+0

Он попадает при загрузке представления, но он не получает удар после того, как метод DeleteContacts был вызван. – chincheta73

0

Наблюдаемая коллекция уже реализует INotifyPropertyChanged, вы не должны делать это снова:

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 
     } 
    } 
} 

Вы только должны удалить старые элементы и добавлять новые элементы. Нет необходимости в другом экземпляре.

EDIT:

Для добавления новых элементов, выполните следующие действия:

Contacts.Add(newContact); 

EDIT EDIT:

Вы, возможно, придется изменить ваш удалить немного, попробуйте это :

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

Я не знаю, есть ли у вас свойство идентификатора в вашем классе контактов, если нет, то используйте что-то еще, чтобы найти правильный контакт, например. Имя или фамилия

+0

Привет, Nawed, я попробовал ваше предложение, но тот же вопрос. Контакт удаляется из коллекции, но он не удаляется из DataGrid. Может быть, проблема с привязкой? Но я не могу обнаружить ошибку. – chincheta73

+0

@ chincheta73, похоже, что у вас есть контактный сервис, и вы также удаляете контакт оттуда, но контакт удаляется на ContactServer или в контактах? Можете ли вы подтвердить, что контакт удален из «Контакты»? –

+0

Я только что сделал тестовый проект, и я использовал 'ItemsSource =" {Binding Contacts} "' и он работал –

Смежные вопросы