[英]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.