更新作为另一个 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.
...
对不起,我不知道如何表述这个问题:
我有两个 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.
...