繁体   English   中英

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

[英]Removing an item from a list on one VM and refreshing the list on another VM

在我的项目中,使用MVVM和C#。 我有2个ViewModel。 首先,它会加载一个列表并从中创建一个可观察的集合列表。

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

列表填充后,从中填充Observable。 然后,将可观察对象加载到gridview中。

在gridview上选择问题后,将带您进入新视图。 此视图使您可以更改问题的数据。 一键字段已更改,我们称之为“已验证”(布尔)。 将Validated从false更改为true,单击完成后,应返回到带有列表的第一个视图。 我的问题是,既然问题已被更改,则应将其从列表中删除。

因此,在第二个View的VM代码中,我有:

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

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

public InitiateWorkViewModel(CallProblems selectedProblem, ProblemsListingViewModel ProblemsList)

selectedProblem只是从第一个视图的列表中选择的问题

我的问题是,一旦导航返回,可观察对象就不希望刷新。 我更改了数据,更改了Validated,从上面第二个代码输入中的列表中删除了该问题,但是当我向后导航时,该问题并没有反映出来。 我该如何纠正?

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

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

我相信您的问题是因为您正在打电话给这个...:

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

...并期望用户界面能够自我更新。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM