不好意思,我不知道如何提出问题:
我有两个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会得到一些执行时间吗?如我所见,我仍然需要刷新它?
答案 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.
...