WP7: могу ли я использовать IEnumerable во ViewModel вместо ObservableCollection? - PullRequest
0 голосов
/ 02 марта 2011

Я довольно новичок в WP7 dev и пытаюсь поиграть с привязкой данных.У меня есть XML-файл, и я хочу представить его в списке.Я сделал ModelView, по которому я делаю запрос Linq, результат которого я хочу поместить в список.Я видел, что во многих примерах DataBinding используется класс ObservableCollection ... Я хотел бы использовать Linq для получения результатов, а не циклически выводить строку за строкой, но если я использую IEnumerable вместо ObservableCollection, DataBinding не работает ...это нормально?

Заранее спасибо и приветствую c.

Ответы [ 4 ]

1 голос
/ 02 марта 2011

Silverlight работает над механизмом изменения свойств, чтобы получать уведомления об изменении свойства для обновления привязки данных.Вы можете использовать свойства зависимостей (весьма маловероятно для модели представления) или реализовать интерфейс INotifyPropertyChanged в классе модели представления.

В случае ObservableCollection он фактически увеличиваетсясобытие CollectionChanged при изменении содержимого (добавление / удаление / вставка), которое также запрашивает привязку данных для обновления.В вашем случае, связываясь с IEnumerable, механизм привязки данных не знает, когда изменилось содержимое, потому что нет событий, вызванных.

Если каждое действие приводит к новому списку, тогда вы 'вы ничего не получаете, создавая ObservableCollection каждый раз при повторном запросе.Поэтому вам нужно будет реализовать интерфейс INotifyPropertyChanged и поднять уведомление об изменении свойства для свойства yrou IEnumerable при повторном запросе.

Если у вас есть элементы для добавления / удаления каждого из нихЕсли вы выполните повторный запрос, то сначала создаете ObservableCollection, а затем вызываете Add / Remove для каждого запроса, все будет работать нормально.

0 голосов
/ 02 марта 2011

, но если я использую IEnumerable вместо ObservableCollection, DataBinding не будет работать

Использование IEnumerable для вашего списка элементов данных не является проблемой, фактически определение длясвойство ItemsSource в ListBox:

public IEnumerable ItemsSource { get; set; }

Скорее всего, проблема в том, что ваше свойство не уведомляет об изменении его значения (используйте интерфейс INotifyPropertyChanged).

Тип ObservableCollection - это коллекция, которая реализует INotifyCollectionChanged, поэтому вы можете легко определить, когда изменилась сама коллекция, хотя это не уведомляет вас, когда изменяются свойства самих элементов коллекции.Он также реализует INotifyPropertyChanged, что, скорее всего, связано с тем, что привязка данных работала с вашим свойством в ViewModel.Причина, по которой ObservableCollection хорошо использовать в этом случае, заключается в том, что вы можете просто добавлять и удалять элементы в коллекции, чтобы обновить элемент управления на основе списка, вам не нужно перепривязывать его (или перестраивать список).

Поэтому, если вы связываетесь со свойством IEnumerable<>, убедитесь, что вы подняли уведомление об изменении свойства, и помните, что добавление / удаление отдельных элементов не будет автоматически отражено в пользовательском интерфейсе, если вы не примете способуведомление о том, что привязанное свойство изменилось (что было бы немного хаком).

0 голосов
/ 02 марта 2011

Вы можете создать ObservableCollection из перечислимого, передав его одному из конструкторов для OC.

ObservableCollection<Foo> x = new ObservableCollection<Foo>(enumerable); 

Предоставлено Приведение результата LINQ к ObservableCollection

Конечно, это применимо только в том случае, если вы хотите избежать обхода записей самостоятельно и у вас нет причин из-за поведения в коде.

0 голосов
/ 02 марта 2011

Я думаю, это должно быть IList, чтобы работать.IEnumerable не будет работать.

Попробуйте добавить .ToList() к вашему запросу LINQ, чтобы преобразовать его в List<T>.

Что касается ObservableCollection<T>, вам нужно использовать егоесли вы планируете изменить элементы в этой коллекции, чтобы UI автоматически обновлял себя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...