2013-03-08 3 views
1

Проведя целый день, пробовав разные предложения, я вернулся в квадрат 1. Я пытаюсь привязать мой взгляд, окно XAML, к одному из моих свойств ViewModel, скажем, SalesOrders , ViewModel, в свою очередь, обсуждает модель (модель EF поверх базы данных). Вопрос, с которым я столкнулся, - это тип коллекции, который я должен использовать, чтобы открыть свойство SalesOrders.WPF: Какой класс коллекции использовать

Я пробовал следующие типы, ни один из которых не выполняет все то, что мне нужно.

  1. List<T>
  2. ObservableCollection<T>
  3. BindingList<T>
  4. CollectionViewSource на вершине выше

Вот что мне нужна моя коллекция сделать:

  1. мнение имеет Предыдущая/Следующая кнопка s, поэтому сбор должен предоставить своего рода валютный менеджер.
  2. В представлении есть кнопка «Сохранить», которая должна быть включена/отключена немедленно в зависимости от того, имеет ли коллекция SalesOrder какие-либо изменения. Поскольку SalesOrder уже является EF-типом, все его поля реализуют INotifyPropertyChanged.

CollectionViewSource дает мне методы навигации (предыдущей/следующей), но не слушает события PropertyChanged, поэтому изменения данных в представлении не поворачивается кнопки Сохранить на. BindingList может прослушивать события PropertyChanged, но не предоставляет способы навигации. ObservableCollection не хватает обеих функций.

TIA.

+1

Звучит так, будто вы должны катиться самостоятельно. – Will

+0

Не могли бы вы просто подключиться к событию «PropertyChanged» модели при добавлении в «CollectionViewSource» и отцеплении при удалении? Затем, в обработчике PropertyChanged, повторно запросите команду кнопки сохранения (которая, как я предполагаю, привязана к 'ICommand') – Thelonias

+1

Почему ваша коллекция' 'нужна? Разве это не то, что для ViewModel? Вы всегда можете катить свой собственный класс, выставляя коллекцию, например, @Will. –

ответ

0

Почему вы не используйте ObservableCollection<T>, затем подпишитесь на событие CollectionChanged, чтобы включить или отключить кнопку сохранения, как указано в ответе на поток MVVM ObservableCollection Bind TwoWay.

+0

Прочтите мой вопрос. ObservableCollection не вызывает CollectionChanged, когда один из элементов в нем изменяется (изменяет одно из его свойств). – dotNET

+0

@dotNET, пожалуйста, прочитайте вторую часть, в которой говорится: «Если вам нужно отслеживать изменения объектов в коллекции, вам нужно построить расширенный ObservableCollection ....» – Oliver

+0

А я вижу. Это то, чем я закончил. Поэтому в некотором смысле это отвечает на вопрос. – dotNET

0

Согласно MSDN о CollectionView here:

В приложениях WPF все коллекции имеют ассоциированную по умолчанию представление коллекции. Вместо того, чтобы напрямую работать с коллекцией, механизм привязки всегда обращается к коллекции через связанный с ней вид . Чтобы получить представление по умолчанию, используйте метод CollectionViewSource.GetDefaultView . Внутренний класс, основанный на CollectionView - это представление по умолчанию для коллекций, которые реализуют только IEnumerable. ListCollectionView - это представление по умолчанию для коллекций , которые реализуют IList. BindingListCollectionView - это представление по умолчанию для коллекций, реализующих IBindingListView или IBindingList.

Что означает, что вы можете использовать BindingList для SalesOrders и связать его в представлении, а затем управлять навигацией вы можете получить доступ к его автоматически создается CollectionView из ViewModel с:

myCollectionView = (BindingListCollectionView)CollectionViewSource.GetDefaultView(this.SalesOrders); 
Смежные вопросы