更新另一个ObservableCollection的结果的ObservableCollection

时间:2019-01-23 18:23:27

标签: c# wpf observablecollection

不好意思,我不知道如何提出问题:

我有两个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,在打开窗口时,我将加载所有对象(因此,无需每次更换过滤器时都重新加载DB)。 我有三种不同的过滤器:  -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会得到一些执行时间吗?如我所见,我仍然需要刷新它?

1 个答案:

答案 0 :(得分: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.
...