我使用linq解析来自webservice的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 result to ObservableCollection 并尝试了这个:
var v = from item in items.Descendants("node")
select new MyViewModel
{
...
};
OApp.MyViewModel.MyItems = new ObservableCollection<MyViewModel>(v);
但是我不能在WP7(Silverlight 3)中这样做,并且没有像这样的构造函数
谢谢!
答案 0 :(得分:1)
我只是发明了一个这样的静态方法: -
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);
答案 1 :(得分:0)
您尝试使用的构造函数位于Silverlight中,但在手机上无法使用。 (根据MSDN)
不幸的是,您必须自己填充ObservableCollection。
答案 2 :(得分:0)
你需要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);
}
}
}