【发布时间】:2019-01-23 18:23:27
【问题描述】:
对不起,我不知道如何提出问题:
我有两个 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,当我打开窗口时,我会加载所有对象(因此每次更改过滤器时我都不需要重新加载数据库)。 我有三种不同的过滤器: - 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 会获得一些执行时间吗?正如我所见,无论如何我都需要刷新它?
【问题讨论】:
-
我不知道您的设计是什么,但在这种情况下,我会避免拥有您的数据的 副本,因为您可以看到很难保留它们同步。我要使用的是可观察集合的 view(它可能足够聪明,可以触发适当的事件,或者总是触发
Reset的哑视图)。 -
@AdrianoRepetti 是的,事实上我认为我做错了(我是 MVVM 概念的新手)。您能否解释一下如何定义这些过滤后的视图?因为在那种情况下它非常简单,但有时我有一个视图是集合视图的过滤器,并且条件位于第二个视图的选定元素上。我现在将编辑我的帖子以添加一些更具体的代码(我知道我做错了什么)。
-
您可以基于一个集合拥有多个视图,并且过滤器可以根据您的喜好变得复杂,只要它们为任何给定记录返回布尔值即可。 social.technet.microsoft.com/wiki/contents/articles/…
-
看看DynamicData,它比可观察集合的视图强大得多
-
here 提出并回答了非常相似的问题。该案例涉及同步两种不同类型的集合,您的方案更简单。
标签: c# wpf observablecollection