【问题标题】:Update an ObservableCollection that is the result of another ObservableCollection更新作为另一个 ObservableCollection 的结果的 ObservableCollection
【发布时间】:2019-01-23 18:23:27
【问题描述】:

对不起,我不知道如何提出问题:

我有两个 ObservableCollection

ObservableCollection MyMainList 是存储我所有对象的 ObservableCollection。

ObservableCollection<T> MyFilteredList = new ObservableCollection(MyMainList.Where(x=>Condition))

是根据一些参数过滤的 ObservableCollection。

在某一时刻,我需要在 MyMainList 中添加或删除对象,但随后 MyFilteredList 不会自动更新。

我总是需要这样做:

MyMainList.Add(newObject);
MyFilteredList.Add(newObject);

有没有办法在一行中完成所有这些,所以当我修改 MyMainList 时,MyFilteredList 会自动更新?

编辑:回答 Adriano Repetti,当我打开窗口时,我会加载所有对象(因此每次更改过滤器时我都不需要重新加载数据库)。 我有三种不同的过滤器: - 1 个组合框“Affaire”(合同列表) - 1 个组合框“阶段”(分包合同列表) - 1 个文本框“过滤器”(如果我只想查看名称中包含该文本的对象)。

当我更改第一个 ComboBox 的选择时,我会更新分包合同列表,并更新过滤后的程序集列表。

private Affaire selectedAffaire;
public Affaire SelectedAffaire
{
   get { return selectedAffaire; }
   set
   {
      selectedAffaire = value;
      this.NotifyPropertyChanged("SelectedAffaire");
      if (value != null)
      {
         GetListPhaseInContract(); //I update the list of subcontracts in 2nd Combobox
      }
      UpdateListAssemblages(); // I update MyFilteredList
   }
}

当我更改第二个 ComboBox(分包)的选择时,我会更新 MyFilteredList 的列表

private Phase selectedPhase;
public Phase SelectedPhase
{
   get { return selectedPhase; }
   set
   {
       selectedPhase = value;
       this.NotifyPropertyChanged("SelectedPhase");
       UpdateListAssemblages();
   }
}

然后当我更改我的 TextBox 值时,我也会更新列表

private string texteFiltre;
public string TexteFiltre
{
   get { return texteFiltre; }
   set
   {
      texteFiltre = value;
      this.NotifyPropertyChanged("TexteFiltre");
      UpdateListAssemblages();
   }
}

如果我明白了,这个post 是我需要寻找的吗?我还不知道什么是 ICollectionView,但我想我需要这样看?使用 ICollectionView 会获得一些执行时间吗?正如我所见,无论如何我都需要刷新它?

【问题讨论】:

  • 我不知道您的设计是什么,但在这种情况下,我会避免拥有您的数据的 副本,因为您可以看到很难保留它们同步。我要使用的是可观察集合的 view(它可能足够聪明,可以触发适当的事件,或者总是触发 Reset 的哑视图)。
  • @AdrianoRepetti 是的,事实上我认为我做错了(我是 MVVM 概念的新手)。您能否解释一下如何定义这些过滤后的视图?因为在那种情况下它非常简单,但有时我有一个视图是集合视图的过滤器,并且条件位于第二个视图的选定元素上。我现在将编辑我的帖子以添加一些更具体的代码(我知道我做错了什么)。
  • 您可以基于一个集合拥有多个视图,并且过滤器可以根据您的喜好变得复杂,只要它们为任何给定记录返回布尔值即可。 social.technet.microsoft.com/wiki/contents/articles/…
  • 看看DynamicData,它比可观察集合的视图强大得多
  • here 提出并回答了非常相似的问题。该案例涉及同步两种不同类型的集合,您的方案更简单。

标签: c# wpf observablecollection


【解决方案1】:

由于您没有向我们提供数据结构的详细信息,我只是假设PhaseInContract 包含在MainList 中。因此,只需为您的MainList 创建两个视图,然后将它们绑定到 UI。所有视图将自动与源同步。

Public ICollectionView MainListView;
Public ICollectionView PhaseInContractView;
Public ObservableCollection<YourDataClass> MainList;

public YourViewModel()
{
    MainList = new ObservableCollection<YourDataClass>();

    // Load datas form db and fill MainList

    MainListView = new CollectionViewSource() { Source = MainList }.View;
    MainListView.Filter = (x) =>
    {
        // your MainListView filtering logic.
    };

    PhaseInContractView = new CollectionViewSource() { Source = MainList }.View;
    PhaseInContractView.Filter = (x) =>
    {
        // your PhaseInContractView filtering logic
    };

private Affaire selectedAffaire;
public Affaire SelectedAffaire
{
    get { return selectedAffaire; }
    set
    {
        selectedAffaire = value;
        this.NotifyPropertyChanged("SelectedAffaire");
        if (value != null)
        {
           PhaseInContractView.Refresh();
        }
        MainListView.Refresh();
    }
}

// And other properties.
...

【讨论】:

  • 实际上我在 ICollectionView (www.blackwasp.co.uk) 上制作了教程,这有助于解决我的问题,需要用这些视图更新我的所有项目,非常有用。谢谢
猜你喜欢
  • 2017-05-24
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 2015-08-22
  • 1970-01-01
相关资源
最近更新 更多