【问题标题】:Removing an item from a ListBox with MVVM使用 MVVM 从 ListBox 中删除项目
【发布时间】:2012-06-23 10:04:30
【问题描述】:

我正在尝试从 ListBox 中删除一个项目。该命令已正确触发,并且该项目已从数据库中正确删除,但未刷新列表。

这里是 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:我知道有类似的问题,但没有一个接受的答案对我有用:(

编辑 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" />

编辑 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); }
    }
}

【问题讨论】:

  • Measures.Remove(measure) 是否返回 true?在 RaisePropertyChanged 行之后,您是否看到您的措施 getter 再次触发?
  • 您能显示将ListBox.ItemsSource 绑定到Measures 的代码吗?我唯一能想到的是绑定有问题。 (此外,您不需要在删除项目后在 Measures 集合上使用 RaisePropertyChanged。当删除项目时,ObservableCollection 会自动引发 CollectionChanged 事件,并将更新绑定)
  • 我一到家就去:)
  • for @Rachel:我终于设法添加了请求的代码。

标签: windows-phone-7 mvvm mvvm-light windows-phone-7.1.1


【解决方案1】:

我看不出有什么明显的错误。我所能建议的就是尝试将您的ListBox 简化为:

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

并删除调用RaisePropertyChanged(() =&gt; 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 发生了某些事情。

【讨论】:

  • 它不起作用:S 我在问题正文中添加了 VM 的完整代码。
猜你喜欢
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-08
相关资源
最近更新 更多