在我的项目中,使用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,在上面的第二个代码输入中从列表中删除了问题,但是当我向后导航时它并没有反映出来。我该如何纠正?
基本上,我想从列表中删除问题,以便用户知道已经完成了该问题的工作,他们无法再次选择它。我不想从可选列表中删除整个记录(来自数据库)
如果还有其他问题,请发表评论,我会相应地编辑问题
答案 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");
}