Wpf 支持筛选、排序、添加、添加和删除带有通知的项目的集合
Silverlight、WPF和Windows Phone是否支持满足以下条件的某些集合:Wpf 支持筛选、排序、添加、添加和删除带有通知的项目的集合,wpf,silverlight,windows-phone-7,mvvm,Wpf,Silverlight,Windows Phone 7,Mvvm,Silverlight、WPF和Windows Phone是否支持满足以下条件的某些集合: 接受IEnumerable作为源 允许对项目进行筛选和排序 允许添加、编辑和删除筛选列表中的项目 对筛选/排序列表的任何更改也会反映到源列表(我认为筛选/排序列表只是源集合的一个视图) 对筛选/排序列表的任何更改都将反映在UI控件(Gridview、ListView…)上 最通用的集合是ObservableCollection。您可以在构造函数中向它传递一个列表。通过LINQ,您可以进行排序和筛选。您还可
IEnumerable
作为源最通用的集合是ObservableCollection。您可以在构造函数中向它传递一个列表。通过LINQ,您可以进行排序和筛选。您还可以使用CollectionViewSource在XAML中进行排序和过滤,但过滤是复杂的。单个项目需要实现iNotitifyPropertyChanged。我只知道WPF 如果将过滤器隐藏在公共属性后面,则可以强制对其重新求值。也许能帮你找到你需要的地方
public partial class MainWindow : Window
{
ObservableCollection<person> Persons = new ObservableCollection<person>();
public MainWindow()
{
InitializeComponent();
Persons.Add(new person("jim", 12));
Persons.Add(new person("aa", 13));
Persons.Add(new person("ff", 14));
Persons.Add(new person("dd", 22));
Persons.Add(new person("hky", 23));
Persons.Add(new person("jsgdim", 24));
List<person> YoungPersons = Persons.Where(per => per.Age < 20).ToList();
Debug.WriteLine(Persons.Count.ToString());
Debug.WriteLine(YoungPersons.Count.ToString());
Debug.WriteLine(YoungPersonsProperty.Count.ToString());
Persons[0].Name = "Jimmy";
Debug.WriteLine(Persons[0].Name);
Debug.WriteLine(YoungPersons[0].Name);
Debug.WriteLine(YoungPersonsProperty[0].Name);
Persons.Remove(Persons[0]);
Debug.WriteLine(Persons.Count.ToString());
Debug.WriteLine(YoungPersons.Count.ToString());
Debug.WriteLine(YoungPersonsProperty.Count.ToString());
string testName;
DateTime startTime = DateTime.Now;
for (int i = 0; i < 1000000; i++)
{
testName = YoungPersonsProperty[0].Name;
}
DateTime endTime = DateTime.Now;
TimeSpan ts = endTime - startTime;
Debug.WriteLine(ts.Milliseconds.ToString());
}
public List<person> YoungPersonsProperty
{
get { return Persons.Where(per => per.Age < 20).ToList(); }
}
public class person : INotifyPropertyChanged
{
string name;
int age;
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public int Age { get { return age; } }
public string Name
{
get { return name; }
set
{
name = value;
NotifyPropertyChanged("Name");
}
}
public person (string Name, int Age)
{
name = Name;
age = Age;
}
}
}
公共部分类主窗口:窗口
{
ObservableCollection Persons=新的ObservableCollection();
公共主窗口()
{
初始化组件();
新增(新人员(“jim”,12));
新增(新人员(“aa”,13));
新增(新人员(“ff”,14));
新增(新增人员(“dd”,22));
新增(新人员(“hky”,23));
新增(新人员(“jsgdim”,24));
列出年轻人=人。其中(per=>per.Age<20)。ToList();
Debug.WriteLine(Persons.Count.ToString());
Debug.WriteLine(YoungPersons.Count.ToString());
Debug.WriteLine(YoungPersonsProperty.Count.ToString());
人员[0]。姓名=“吉米”;
Debug.WriteLine(人员[0].Name);
Debug.WriteLine(年轻人[0].Name);
Debug.WriteLine(YoungPersonsProperty[0].Name);
人员。移除(人员[0]);
Debug.WriteLine(Persons.Count.ToString());
Debug.WriteLine(YoungPersons.Count.ToString());
Debug.WriteLine(YoungPersonsProperty.Count.ToString());
字符串testName;
DateTime startTime=DateTime.Now;
对于(int i=0;i<1000000;i++)
{
testName=YoungPersonsProperty[0]。名称;
}
DateTime endTime=DateTime.Now;
TimeSpan ts=结束时间-开始时间;
Debug.WriteLine(ts.millizes.ToString());
}
公共列表YoungPersonsProperty
{
获取{return Persons.Where(per=>per.Age<20.ToList();}
}
公共类人员:INotifyPropertyChanged
{
字符串名;
智力年龄;
公共事件属性更改事件处理程序属性更改;
受保护的void NotifyPropertyChanged(字符串信息)
{
if(PropertyChanged!=null)
{
PropertyChanged(此,新PropertyChangedEventArgs(信息));
}
}
公共整数年龄{get{return Age;}}
公共字符串名
{
获取{返回名称;}
设置
{
名称=值;
NotifyPropertyChanged(“名称”);
}
}
公众人物(字符串名称,整数年龄)
{
名称=名称;
年龄=年龄;
}
}
}
我记得在不将LINQ过滤器隐藏在属性后面的情况下动态应用了LINQ过滤器,但我记不起是如何应用的。您想要一个ObservableCollection。真的没有别的了 变体是您自己的对象,它实现IList,但在内部执行您想要的任何操作。为此,您将创建一个如下所示的类
class MyClass: IList, INotifyPropertyChanged
{
//implement it
}
编辑:
还有一个我已经这样做了,但是当我使用linq过滤时,我会得到两个单独的列表,一个是原始列表,另一个是过滤列表。如果我从筛选中删除了一个项目,则原始项目不会得到更新,因此我需要手动同步它们。请参见我的观点4。是的,但这是非常低效的,每次删除/添加一个人时,您都在重新创建筛选的集合。另一件事是,控件将绑定到筛选列表,而不是列表,因此添加/删除记录将发生在筛选列表上,因此同步将与人员进行,而不是年轻人收集,这使得同步过程更加困难。非常低效??查看我运行的计时测试。在723毫秒内调用100万次YoungPersonsProperty,即每次调用.000723毫秒。这是在P4桌面上。很明显你不了解林克。至于同步,这很容易,但我已经帮了你。没有必要告诉我,我不明白的东西,即使它是真的。低效并不意味着慢。假设您需要在一个包含10列的网格中重新加载数百条记录,仅添加/删除一条记录就浪费了大量内存和时间。更不用说在删除操作中,您需要在重新加载之前保存一个记录指针,这样您就可以回到原来的位置。如果某件事很容易做,并不一定意味着这是最好的方法。我也从来没有说过我不知道如何同步两个集合,我问是否有一个已经存在的解决方案。再说一次,如果你再次阅读我的文章,你会发现你在实践中建议的方法是不可能的,因为你永远不会绑定到原始集合,而是绑定到筛选的集合,所以你需要同步原始集合,而不是筛选的集合。实际上,ObservableCollection不会提供我想要的。在这种特殊情况下,我知道通过网络检索的数据不能被任何其他人更改,所以我只想查询一次。这意味着当我过滤时,我正在创建一个新的集合,然后我需要同步它们,过滤->原始。所以我需要像CollectionView这样具有可编辑功能的东西。