支持通过通知过滤,排序,发送,添加和删除项目的集合

时间:2012-02-26 17:17:02

标签: wpf silverlight windows-phone-7 mvvm

Silverlight,WPF和Windows Phone是否支持一些符合以下条件的集合:

  1. 接受IEnumerable<T>作为来源
  2. 允许过滤和排序项目
  3. 允许添加,编辑和删除已过滤列表中的项目
  4. 对过滤/排序列表的任何更改也会反映到源列表中(我只考虑过滤/排序列表作为源集合的视图)
  5. 对过滤/排序列表的任何更改都将反映在UI控件(Gridview,ListView ...)上。

2 个答案:

答案 0 :(得分:0)

最通用的系列是ObservableCollection。您可以在构造函数中传递List。通过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;
        }
    }
}

我记得让LINQ过滤器动态应用而不会将它们隐藏在Property之后,但我不记得是怎么做的。

答案 1 :(得分:0)

你想要一个ObservableCollection。真的没别的了。

变体是您自己的实现IList的对象,但内部可以执行您想要的任何操作。为此,你要创建一个类似于

的类
class MyClass: IList, INotifyPropertyChanged
{
  //implement it
}

修改 还有CollectionViewSource object