Привязка данных с помощью Silverlight
-
02-07-2019 - |
Вопрос
Если я хочу привязать коллекцию к какой-либо форме управления списком в Silverlight.Является ли единственный способ сделать это так, чтобы базовые объекты в коллекции реализовали INotifyPropertyChanged, а коллекция была Observablecollection?
Если бы я использовал какой-то сторонний объект, например, возвращаемый веб-службой, мне пришлось бы обернуть его или сопоставить с чем-то, что реализует INotifyPropertyChanged ?
Решение
Нет, как только вы добавите ссылку на службу в свой проект Silverlight в Visual Studio, вы можете щелкнуть ее правой кнопкой мыши и настроить так, чтобы она использовала ObservableCollection (которая в любом случае является настройкой по умолчанию).
Кроме того, ссылка на службу по умолчанию гарантирует, что возвращаемые типы службы уже реализуют INotifyPropertyChanged.
Другие советы
Вы можете привязать список к любой коллекции IEnumerable или простой элемент управления к любому свойству объекта.Недостатком является то, что вы не получаете уведомления об изменении, если в список добавляются элементы или изменяются свойства.Так что это зависит от вашего приложения, является ли это проблемой или нет.
Как сказал Морис, вы можете привязаться к любой коллекции (даже IEnumerable), и привязка будет работать, но вы не будете получать уведомления об изменениях.Однако обратите внимание, что вам не обязательно использовать ObservableCollection: все, что реализует INotifyCollectionChanged, будет работать (хотя ObservableCollection является самым простым).
Объектам в коллекции не обязательно реализовывать INotifyPropertyChanged, но если это так, вы будете получать уведомления о каждом отдельном изменении.
Чтобы внести ясность, вы можете Один раз привязать к любому объекту.Если вы хотите В одну сторону или Двусторонний Если вы привязываете объект, он поддерживает один из этих интерфейсов.Как уже упоминалось, создание ссылки на службу делает это за вас для объектов, доставляемых через веб-сервис.Однако, если по какой-то причине вам все равно необходимо создать Bindable-объект из устаревшего класса, вы можете реализовать Converter, реализующий IValueConverter, а затем использовать его для «обертывания» вашего устаревшего объекта в Bindable, живя следующим образом:
<UserControl>
<UserControl.Resources>
<local:FooToBindableFooConverter x:Key="BindableFooConverter"/>
</UserControl.Resources>
<TextBlock Text="{Binding FooInstance, Converter={StaticResource BindableFooConverter}}"/>
</UserControl>
Конвертеры очень эффективны и могут решить множество проблем типа «Мне нужно X, но у меня есть Y».