代码之家  ›  专栏  ›  技术社区  ›  Thomas Joulin

WP7将所有LINQ结果插入到ObservableCollection中

  •  2
  • Thomas Joulin  · 技术社区  · 14 年前

    我使用linq解析Web服务的XML结果:

    XElement items = XElement.Parse(e.Result);
    MyListBox.ItemsSource = from item in items.Descendants("node")
                select new MyViewModel
                {
                   ...
                };
    

    这将自动填充我的列表框。但问题是,我通常是这样访问我的可观察的集合:

    App.MyViewModel.MyItems;
    

    在我的XAML中:

    ItemsSource="{Binding MyItems,}"
    

    如何直接修改我的ObservableCollection?我读 Cast LINQ result to ObservableCollection 尝试过:

    var v = from item in items.Descendants("node")
                select new MyViewModel
                {
                   ...
                };
    OApp.MyViewModel.MyItems = new ObservableCollection<MyViewModel>(v);
    

    但是我不能在WP7(Silverlight3)中这样做,而且没有像这样的构造函数

    谢谢!

    3 回复  |  直到 14 年前
        1
  •  1
  •   AnthonyWJones    14 年前

    我发明了一种静态方法,就像这样:

    public static ObservableCollection<T> CreateObservableCollect<T>(IEnumerable<T> range)
    {
        var result = new ObservableCollection<T>();
        foreach (T item in range)
        {
            result.Add(item);
        }
        return result;
    }
    

    现在,最后一行代码变成:

     OApp.MyViewModel.MyItems = new CreateObservableCollection<MyViewModel>(v);   
    
        2
  •  0
  •   Matt Lacey    14 年前

    您尝试使用的构造函数在Silverlight中,只是在电话上不可用。(按规定) MSDN )

    不幸的是,您必须自己填充您的ObservableCollection。

        3
  •  0
  •   Rover    14 年前

    你需要观察收集吗?您需要从集合中添加或删除对象,还是只需要更新?

    如果只更新,则可以将myviewModel.myitems更改为:

    public MyTypeOfCollection MyItems
    {
        get { return _myItems; }
        set
        {
            _myItems = value;
            OnNotifyPropertyChanged("MyItems");//invoke INotifyPropertyChanged.PropertyChanged
        }
    }
    

    如果需要添加或删除项,可以将集合扩展到:

    public static class Extend
    {
        // Extend ObservableCollection<T> Class
        public static void AddRange(this System.Collections.ObjectModel.ObservableCollection o, T[] items)
        {
            foreach (var item in items)
            {
                o.Add(item);
            }
        }
    }