Entity Framework - привязка свойства навигации к ListBox - PullRequest
5 голосов
/ 20 февраля 2011

Я работаю с MVVM и Entity Framework. У меня есть объект «Quote» со свойством навигации «QuoteProducts», которое содержит все продукты в цитате.

Мой ViewModel имеет свойство «CurrentQuote», которое имеет тип «Цитата», и мое представление имеет следующий ListBox:

<ListBox ItemsSource="{Binding CurrentQuote.QuoteProducts}">

Отлично работает, по большей части. Я загружаю цитату, ListBox заполняется, и все супер. Однако, когда я добавляю новый продукт, используя

QuoteProduct product = new QuoteProduct();
product.Product = SelectedProduct;
CurrentQuote.QuoteProducts.Add(product);

новый продукт не отображается в ListBox. Я немного читал, и похоже, причина в том, что коллекция за свойством навигации не уведомляет пользовательский интерфейс о том, что оно изменилось. Но то, что я не нашел, было чистым способом заставить это делать именно это.

Я видел одно решение, которое требовало вести отдельный список QuoteProducts, привязывать его и добавлять к обоим при добавлении продукта, но это не похоже на правильный путь.

Можно ли каким-либо образом привязать функциональность к моей модели данных, чтобы она уведомляла об изменении коллекций?

Ответы [ 3 ]

2 голосов
/ 20 февраля 2011

Нет, нет, вам придется изменить объявление CurrentQuote.QuoteProducts на класс, который реализует INotifyCollectionChanged. Причина проста - WPF смотрит не объект CurrentQuote, а непосредственно коллекцию CurrentQuote.QuoteProducts.

0 голосов
/ 27 февраля 2011

EntityObservableCollection может помочь в вашем сценарии. Код для этой коллекции и пример кода можно найти в BookLibrary примере приложения WPF Application Framework (WAF) .

0 голосов
/ 21 февраля 2011

Самый простой метод, который я использую, - вместо привязки к ObservableCollection напрямую, используйте ICollectionView. По-прежнему использовать ObservableCollection в качестве базового ICollection, но он не вызывает все события, необходимые пользовательскому интерфейсу. Я на самом деле пытаюсь использовать IBindingList вместо OC в WPF, потому что OC никогда не вызывают обновленные события, когда коллекция обновляется из пользовательского интерфейса, вы можете знать только, когда что-то добавлено или удалено. Это не совсем верно, так как вы можете прослушивать обновления отдельных свойств элемента, но на мой взгляд, он абстрагируется от него далеко.
Единственное место, где я действительно использую ObservableCollection, находится в Silverlight / WP7, потому что другого выбора нет. Они имеют больше смысла в использовании, когда пользовательский интерфейс - тупой вид, и все добавляется через виртуальную машину, хотя это редко для меня.

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