【问题标题】:Removing an item from a list on one VM and refreshing the list on another VM从一个 VM 上的列表中删除项目并刷新另一个 VM 上的列表
【发布时间】:2014-05-25 08:09:46
【问题描述】:

在我的项目中,使用 MVVM 和 C#。我有 2 个 ViewModel。这首先加载一个 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; }

一旦列表被填满,Observable 就会被填充。然后我将 observable 加载到 gridview 中。

一旦您在网格视图上选择了一个问题,您就会被带到一个新视图。此视图允许您更改问题的数据。一个关键字段发生了变化,我们称之为 Validated (bool)。 Validated 从 false 更改为 true,一旦单击完成,您应该返回到第一个视图,其中包含列表。 我的问题是,既然问题已经改变,应该从列表中删除。

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

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

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

public InitiateWorkViewModel(CallProblems selectedProblem, ProblemsListingViewModel ProblemsList)

selectedProblem 就是从第一个 View 的列表中选择的问题

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

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

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

【问题讨论】:

  • 看看 CollectionViewSource 和过滤,你可以应用过滤器隐藏已解决的问题,这里是链接:abhisheksur.com/2010/08/…
  • 我是否正确地说您从ObservableCollection 填充List&lt;&gt;,然后使用List&lt;&gt; 填充GridView?您是否使用 XAML 绑定来执行此操作?
  • @AndrewStephens 走错路了。我使用列表从数据库中获取记录,然后从列表中填充 observable,然后从 observable 中填充 gridview。
  • @NicholasAysen,如果你重新阅读你的问题,看起来实际上是你弄错了......你说 第一个加载一个 Observable Collection 列表并创建一个普通 List从它一旦Observable被填充,列表就会从它填充。然后我将列表加载到网格视图中。如果不正确,请在您的问题中更正。
  • @Sheridan 我已经编辑了这个问题。感谢您纠正我

标签: c# wpf list mvvm observablecollection


【解决方案1】:

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

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");
}

【讨论】:

    猜你喜欢
    • 2017-08-02
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    相关资源
    最近更新 更多