Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 支持筛选、排序、添加、添加和删除带有通知的项目的集合_Wpf_Silverlight_Windows Phone 7_Mvvm - Fatal编程技术网

Wpf 支持筛选、排序、添加、添加和删除带有通知的项目的集合

Wpf 支持筛选、排序、添加、添加和删除带有通知的项目的集合,wpf,silverlight,windows-phone-7,mvvm,Wpf,Silverlight,Windows Phone 7,Mvvm,Silverlight、WPF和Windows Phone是否支持满足以下条件的某些集合: 接受IEnumerable作为源 允许对项目进行筛选和排序 允许添加、编辑和删除筛选列表中的项目 对筛选/排序列表的任何更改也会反映到源列表(我认为筛选/排序列表只是源集合的一个视图) 对筛选/排序列表的任何更改都将反映在UI控件(Gridview、ListView…)上 最通用的集合是ObservableCollection。您可以在构造函数中向它传递一个列表。通过LINQ,您可以进行排序和筛选。您还可

Silverlight、WPF和Windows Phone是否支持满足以下条件的某些集合:

  • 接受
    IEnumerable
    作为源
  • 允许对项目进行筛选和排序
  • 允许添加、编辑和删除筛选列表中的项目
  • 对筛选/排序列表的任何更改也会反映到源列表(我认为筛选/排序列表只是源集合的一个视图)
  • 对筛选/排序列表的任何更改都将反映在UI控件(Gridview、ListView…)上

  • 最通用的集合是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这样具有可编辑功能的东西。