更新作为另一个 ObservableCollection 结果的 ObservableCollection

Update an ObservableCollection that is the result of another 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,当我打开我的 window 时,我加载了所有对象(因此我不需要在每次更改过滤器时都重新加载我的数据库)。 我有三个不同的过滤器: - 1 个组合框 "Affaire"(合约列表) - 1 个组合框 "Phase"(分包合同列表) - 1 TextBox "Filter"(如果我只想查看名称中包含该文本的对象)。

当我更改第一个 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
   }
}

当我更改第二个组合框(分包)的选择时,我更新了 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 会获得一些执行时间吗?如我所见,无论如何我都需要刷新它?

因为你没有告诉我们数据结构的细节,我只是假设 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.
...