从一个VM上的列表中删除项目并刷新另一个VM上的列表

时间:2014-04-11 09:01:23

标签: c# wpf list mvvm observablecollection

在我的项目中,使用MVVM和C#。我有2个ViewModels。这首先加载一个List并从中创建一个Observable Collection List。

private ObservableCollection<Problems> _ProblemsList;
    public ObservableCollection<Problems> ProblemsList
    {
        get 
        {
            return _ProblemsList;
        }
        set
        {
            _ProblemsList = value;
            OnPropertyChanged(null);
        }
    }
    public List<Problems> Problems { get; set; }

填充List后,将从中填充Observable。然后我将observable加载到gridview中。

在gridview上选择问题后,您将进入新视图。此视图允许您更改问题的数据。一个关键字段被更改,我们称之为Validated(bool)。 验证从false更改为true,一旦单击完成,您应该返回第一个带有列表的View。 我的问题是,现在问题已经改变,应该从列表中删除。

所以在我的第二个View的VM代码中,我有:

protected void DeleteFromList()
    {
        long id = selectedProblem.ID;
        ProblemsList.ProblemsList.Remove(x => x.ID == id);
    }

第一个ProblemsList是前一个VM的实例,ProblemsListingViewModel.cs 我将实例发送到下一个VM,它们被填充并声明:

public InitiateWorkViewModel(CallProblems selectedProblem, ProblemsListingViewModel ProblemsList)

selectedProblem只是从第一个View

列表中选择的问题

我的问题是,当我向后导航时,观察者不想刷新。我更改了数据,更改了Validated,在上面的第二个代码输入中从列表中删除了问题,但是当我向后导航时它并没有反映出来。我该如何纠正?

基本上,我想从列表中删除问题,以便用户知道已经完成了该问题的工作,他们无法再次选择它。我不想从可选列表中删除整个记录(来自数据库)

如果还有其他问题,请发表评论,我会相应地编辑问题

1 个答案:

答案 0 :(得分:0)

我相信你的问题是因为你在说这个......:

ProblemsList.ProblemsList.Remove(x => x.ID == id);

...并期待UI自我更新。

不幸的是,ObservableCollection.Remove方法不会引发INotifyPropertyChanged.PropertyChanged事件,因此UI不会更新。有几种方法可以解决这种情况,因为您需要做的就是在添加或删除集合中的项目时引发INotifyPropertyChanged.PropertyChanged事件。

最简单的方法是在视图模型中将处理程序附加到ProblemsList.CollectionChanged事件。然后,每次在集合中添加或删除项目时,您都可以引发INotifyPropertyChanged.PropertyChanged事件:

private void ProblemsList_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    NotifyPropertyChanged("ProblemsList");
}