繁体   English   中英

WP7将所有linq结果插入ObservableCollection中

[英]WP7 Insert all linq results in an ObservableCollection

我使用linq解析来自Web服务的xml结果:

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

这将自动填充我的ListBox。 但是问题是,我通常这样访问我的ObservableCollection:

App.MyViewModel.MyItems;

在我的xaml中:

ItemsSource="{Binding MyItems,}"

如何直接修改ObservableCollection? 我将Cast LINQ结果读取到ObservableCollection并尝试了以下操作:

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

但自从WP7(Silverlight 3)以来,我不能这样做,而且没有这样的构造函数

谢谢 !

我只是发明了这样的静态方法:

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);   

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

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

您是否需要ObservableCollection? 您是否需要从集合中添加或删除对象,或者只是更新?

如果仅更新,则可以将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);
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM