WP7 Вставить все результаты linq в коллекцию ObservableCollection - PullRequest
2 голосов
/ 24 ноября 2010

Я анализирую результаты XML из веб-службы, используя linq:

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?Я прочитал приведение результата LINQ к ObservableCollection и попробовал это:

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

Но с тех пор я не могу этого сделать в WP7 (Silverlight 3), и такого конструктора нет

Спасибо!

Ответы [ 3 ]

1 голос
/ 25 ноября 2010

Я бы просто изобрел статический метод, подобный этому: -

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);   
0 голосов
/ 24 ноября 2010

Вам нужна 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);
        }
    }
}
0 голосов
/ 24 ноября 2010

Конструктор, который вы пытаетесь использовать, находится в Silverlight, но недоступен на телефоне.(согласно MSDN )

К сожалению, вам придется заполнить свою коллекцию ObservableCollection самостоятельно.

...