I'm trying to remove an item from a ListBox. The command is properly fired and the item is correctly removed from the database but the list is not refreshed.
Here is the ViewModel. I'm using 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); }
}
}
Thanks for the help.
PS: I know there are similar questions but none of the accepted answers worked for me :(
EDIT 1 This is the code I use in the XAML page to bind the ListBox to the list of items:
<ListBox Grid.Row="1" DataContext="{Binding Path=Measures}" ItemsSource="{Binding}" />
here is the binding of the ViewModel to the main container
<Grid DataContext="{Binding Source={StaticResource Locator}, Path=ViewAll}" x:Name="LayoutRoot" />
EDIT 2 This is the full code of the 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); }
}
}