Связывает ли WPF с данными больше боли, чем стоит? - PullRequest
5 голосов
/ 21 февраля 2009

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

Я что-то упустил? Это похоже на кучу работы, и необходимость сделать классы реализованными INotifyPropertyChanged выглядит как ловкий способ заставить привязку данных работать.

Чего мне не хватает? Я должен что-то упустить. Пожалуйста, расскажите мне, как сделать привязку данных простой или, по крайней мере, простой.

Ответы [ 8 ]

4 голосов
/ 21 февраля 2009

По правде говоря, я не видел, чтобы это было так плохо, и думаю, что это очень работоспособное решение.

Возьмем этот простой объект модели данных:

Public Class SimpleItemViewModel
Implements INotifyPropertyChanged

Private _item As String 
Public Property Item As String
   Get 
       return _item 
   End Get 
   Set (value as string) 
      _item = value : OnPropertyChanged("Item") 
   End Set 
End Property 

Protected Overridable Sub OnPropertyChanged(propChange as string) 
   Raise Event PropertChanged(me, new PropertyChangedEventArgs(propChange))
End Sub 
Public Event PropertyChanged(sender as object, e as PropertyChangedEventArgs)
End Class

Это легко связать с простым Textbox через:

<Textbox Text="{Binding Item}" />

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

Мне показалось, что проще всего иметь набор классов, которые располагаются между уровнем доступа к данным и пользовательским интерфейсом, в котором хранится этот материал. Вы даже можете заставить свою Business Logic и DAL передавать эти классы, а не атомарные значения.

4 голосов
/ 21 февраля 2009

Если вы хотите, чтобы пользовательский интерфейс был уведомлен об изменении базового источника данных, вам нужен некоторый своего рода механизм уведомления. Для WPF этот механизм является INotifyPropertyChanged.

То же самое относится и к Windows Forms, но Windows Forms также поддерживает старый механизм уведомлений, где у вас есть событие с именем <Property>Changed.

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

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

2 голосов
/ 21 февраля 2009

Реализация INotifyProperty изменения не особенно сложна, поскольку в ней только один член.

Если вы не ожидаете изменений в базовом объекте, не беспокойтесь об изменении INotifyProperty и используйте привязку с Mode=OneTime.

Если базовый объект может измениться, и вы хотите, чтобы графический интерфейс отображал эти изменения, то как еще этого можно достичь без уведомлений, которые предоставляет INotifyProperty? Не стоит ожидать, что связанный элемент будет опрашивать источник своей привязки.

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

1 голос
/ 27 февраля 2009

Связывание в XAML довольно просто, однако динамическое связывание данных WPF в коде является болезненным и запутанным.

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

Будьте настолько декларативны, насколько это возможно в вашей привязке. Позвольте системе шаблонов выполнить свою работу и интенсивно использовать DataTemplate s, которые указывают явные DataType s.

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

Если вы ищете хороший способ подумать о структурировании привязки данных, постарайтесь установить DataContext в логическом дереве только один раз, а затем использовать пути привязки для заполнения различных частей вашего пользовательского интерфейса.

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

Во-первых, INotifyPropertyChanged - не единственный способ заставить работать привязку данных - свойства зависимости тоже работают.

Во-вторых, INotifyPropertyChanged может быть реализован только с одной строкой кода в вашем классе сущности, если вы используете AOP - вам не нужно делать все эти вызовы уведомлений самостоятельно.

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

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

Привязка данных - это единственный способ реализовать шаблон представления модели в WPF / Silverlight. Ваши модели могут быть UI-глупыми, реализуя INotifyPropertyChanged, который изолирует их от UI. Он также сохраняет много кода пользовательского интерфейса при вставке информации в пользовательский интерфейс.

Еще одним преимуществом, которое мне нравится, является возможность дальнейшего связывания дочерних элементов управления с теми же данными с помощью ярлыка {Binding}.

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