Обновите коллекцию ObservableCollection, которая является результатом другой коллекции ObservableCollection - PullRequest
0 голосов
/ 23 января 2019

Извините, но я не знал, как сформулировать вопрос:

У меня есть два ObservableCollection

ObservableCollection MyMainList - это ObservableCollection, где хранятся все мои объекты.

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

- это коллекция ObservableCollection, отфильтрованная по некоторым параметрам.

В какой-то момент мне нужно добавить или удалить объекты из MyMainList, но тогда MyFilteredList не обновляется автоматически.

Мне нужно всегдасделать:

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

Есть ли способ сделать все это в одной строке, поэтому, когда я изменяю MyMainList, MyFilteredList будет автоматически обновляться?

Редактировать: Чтобы ответить АдрианоРепетти, когда я открываю свое окно, я загружаю все объекты (поэтому мне не нужно перезагружать мою БД каждый раз, когда я меняю фильтры).У меня есть три разных фильтра: - 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
   }
}

Когда я меняю выбор 2nd 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();
   }
}

Если я понял, это сообщение являетсячто мне нужно искать?Я еще не знаю, что такое ICollectionView, но я думаю, мне нужно выглядеть таким образом? Я получу некоторое время выполнения с помощью ICollectionView?как я вижу, мне все равно нужно обновить его?

1 Ответ

0 голосов
/ 24 января 2019

Поскольку вы не указали нам структуру данных, я просто предполагаю, что PhaseInContract включено в MainList. Итак, просто создайте два представления для вашего MainList, а затем привязайте их к пользовательскому интерфейсу. Все виды автоматически синхронизируются с источником.

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.
...
...