2012-06-23 2 views
2

Я пытаюсь удалить элемент из ListBox. Команда правильно запущена, и элемент правильно удален из базы данных, но список не обновляется.Удаление элемента из списка с MVVM

Описание ViewModel. Я использую MVVM Light 4.1

public class ViewAllViewModel : ViewModelBase 
{ 
    public ViewAllViewModel() 
    { 
     NavigateToAddNew = new RelayCommand(() => NavigationController<Views>.Current.NavigateTo(Views.AddNew)); 
     Remove = new RelayCommand<int>(DeleteMeasure); 

     using (var repository = App.ServiceLocator.Get<IRepository>()) 
     { 
      Measures = new ObservableCollection<Measure>(repository.Measures); 
     } 
    } 

    private void DeleteMeasure(int measureId) 
    { 
     Measure measure; 

     using (IRepository repository = App.ServiceLocator.Get<IRepository>()) 
     { 
      measure = repository.Measures.Single(m => m.Id == measureId); 
      repository.Measures.Delete(measure); 
      repository.SaveChanges(); 
     } 

     measure = Measures.Single(m => m.Id == measureId); 
     if (Measures.Remove(measure)) 
     { 
      RaisePropertyChanged(() => Measures); 
     } 
    } 

    public RelayCommand NavigateToAddNew { get; set; } 
    public RelayCommand<int> Remove { get; set; } 

    private ObservableCollection<Measure> _measures; 
    public ObservableCollection<Measure> Measures 
    { 
     get { return _measures; } 
     set { Set(() => Measures, ref _measures, value); } 
    } 
} 

Спасибо за помощь.

PS: Я знаю, что есть подобные вопросы, но ни один из принятых ответов не работает для меня :(

EDIT 1 Это код, который я использую в странице XAML для привязки ListBox к списку пункты:

<ListBox Grid.Row="1" DataContext="{Binding Path=Measures}" ItemsSource="{Binding}" /> 

здесь связывание ViewModel к основному контейнеру

<Grid DataContext="{Binding Source={StaticResource Locator}, Path=ViewAll}" x:Name="LayoutRoot" /> 

EDIT 2 Это полный код ViewModel

public class ViewAllViewModel : ViewModelBase 
{ 
    public ViewAllViewModel() 
    { 
     NavigateToAddNew = new RelayCommand(() => NavigationController<Views>.Current.NavigateTo(Views.AddNew)); 
     Remove = new RelayCommand<int>(DeleteMeasure); 

     LoadMeasures(); 

     Messenger.Default.Register<PropertyChangedMessage<ObservableCollection<Measure>>>(this, message => LoadMeasures()); 
    } 

    private void LoadMeasures() 
    { 
     using (var repository = App.ServiceLocator.Get<IRepository>()) 
     { 
      Measures = new ObservableCollection<Measure>(repository.Measures.OrderByDescending(m => m.MeasureDate).ThenByDescending(m => m.Id).Take(20)); 
     } 
    } 

    private void DeleteMeasure(int measureId) 
    { 
     Measure measure; 

     using (IRepository repository = App.ServiceLocator.Get<IRepository>()) 
     { 
      measure = repository.Measures.Single(m => m.Id == measureId); 
      repository.Measures.Delete(measure); 
      repository.SaveChanges(); 
     } 

     measure = Measures.Single(m => m.Id == measureId); 
     Measures.Remove(measure); 

     RaisePropertyChanged("LastMeasure", null, measure, true); 
    } 

    public RelayCommand NavigateToAddNew { get; set; } 
    public RelayCommand<int> Remove { get; set; } 

    private ObservableCollection<Measure> _measures; 
    public ObservableCollection<Measure> Measures 
    { 
     get { return _measures; } 
     set { Set(() => Measures, ref _measures, value); } 
    } 
} 
+0

Есть ли меры. Исключить (измерить) значение true? вы видите, что ваш огонь мерцает снова после линии RaisePropertyChanged? –

+2

Можете ли вы показать код, который связывает 'ListBox.ItemsSource' с' Measures'? Единственное, что я могу придумать, - это что-то не так с привязкой. (Также вам не нужно «RaisePropertyChanged» в коллекции «Measures» после удаления элемента. «ObservableCollection» автоматически вызывает событие «CollectionChanged», когда элемент удаляется, и обновляет привязку). – Rachel

+0

Я буду как скоро, когда я доберусь домой :) – Kralizek

ответ

1

Я не вижу ничего, очевидно, неправильно. Все, что я могу предложить, чтобы попытаться упростить ваш ListBox только это:

<ListBox Grid.Row="1" ItemsSource="{Binding Path=Measures}" /> 

и удалить код, который вызывает RaisePropertyChanged(() => Measures); (так как это не должно быть необходимости).

Если ни один из этих работ, я бы проверить, чтобы увидеть, что произойдет, если вы полностью сбросить Measures свойство, как:

private void DeleteMeasure(int measureId) 
{ 
    using (IRepository repository = App.ServiceLocator.Get<IRepository>()) 
    { 
     var measure = repository.Measures.Single(m => m.Id == measureId); 
     repository.Measures.Delete(measure); 
     repository.SaveChanges(); 
    } 

    Measures = repository.Measures; 
} 

Если это вызывает успешное обновление в ListBox, это будет означать, что что-то происходит с ObservableCollection.

+0

Это не сработало: S Я добавил полный код виртуальной машины в теле вопроса. – Kralizek

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