Каковы лучшие практики с привязкой данных и ObservableCollections в WPF? - PullRequest
0 голосов
/ 24 января 2011

Я использую LinqToSql в качестве источника данных, скажем, я запрашиваю список программистов из таблицы, а затем перебираю эти данные, заполняя ObservableCollection.(Первый вопрос, эта часть неверна? Просто кажется странным запрашивать данные в списке, а затем перебирать их, чтобы заполнить другой список)

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

Что я не совсем понимаю, так это то, что наилучшей практикой является возвращение данных из ОК в мой исходный источник данных.Должен ли я просто пройтись по наблюдаемой коллекции, передавая мои изменения, обновляя каждую запись?Это не очень эффективно.

Большое спасибо за вашу помощь!-Josh

Ответы [ 2 ]

1 голос
/ 24 января 2011

Это чисто проблема модели представления. Вы имеете полный контроль над всеми объектами и свойствами на стороне данных ограждения. Иногда у вас есть простое соглашение, в котором пользователь может редактировать только одну запись, привязка данных выполняет всю работу, и вы просто записываете ее обратно в базу данных, когда пользователь нажимает сохранить.

Если у вас отображается намного больше данных, и пользователь может изменить любой их фрагмент, то, возможно, имеет смысл оставить грязный флаг в самом объекте, который записывает, были ли какие-либо свойства изменилось. Таким образом, вы сможете эффективно сохранить только измененные записи.

Поскольку ваши объекты, вероятно, поддерживают INotifyPropertyChanged, а ваши коллекции доступны для наблюдения, вы даже можете автоматически обнаруживать грязный флаг и управлять им. Или, может быть, проще просто установить значение dirty в true во всех ваших установщиках.

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

0 голосов
/ 26 апреля 2017

ObservableCollection - не единственная коллекция, которую вы можете использовать в wpf. Но это стандартная коллекция позволяет wpf автоматически обновлять контейнеры элементов пользовательского интерфейса, такие как ListBox, при изменениях коллекции, таких как добавление или удаление элемента. Вы не можете сделать это с помощью List.

Когда пользователь изменяет текстовое поле в ListBoxItem, коллекция ObservableCollection не обновляется, поскольку вы не добавляете, не удаляете и не переупорядочиваете элементы в коллекции. Вы изменяете свойство в одном из пунктов.

ListBox содержит список контейнеров ListBoxItem, по одному для каждого элемента в коллекции, указанной как ItemsSource. DataContext каждого ListBoxItem устанавливается на соответствующий элемент, хранящийся в ObservableCollection. Таким образом, если вы измените текст в TextBox в коде, механизм привязки изменит свойство этого элемента, указанное для TextBox.Text в привязке. Ничего не нужно изменять или обновлять для объекта ObservableCollection.

В установщике свойства такого элемента обычно вызывается событие PropertChanged интерфейса INotifyPropertyChanged. Это также обычное место для установки грязного флага. Затем вы также можете сразу же зафиксировать изменения, сохранить список грязных объектов или найти их при фиксации, например:

items.Where(item => item.IsDirty)

Также есть хорошие инструменты, такие как Snoop и WPFInspector, которые очень помогают вам понять визуальное дерево приложения wpf и текстовые данные для каждого элемента

...