Dependency Property Расширение разметки (Markup Extensions) Привязки (binding) Лекция 13.

Презентация:



Advertisements
Похожие презентации
Программирование на C# 4 и.NET 4 Лекция 15. WPF. Шаблон элемента управления Элементы управления WPF спроектированы таким образом, чтобы полностью отделить.
Advertisements

Классы Windows Presentation Foundation System.Object DispatcherObject ApplicationDependencyObject Visual UIElement FrameworkElement Page Shape TextBlock.
Михаил Черномордиков Developer Evangelist, Microsoft Россия
Классы Windows Presentation Foundation System.Object DispatcherObject ApplicationDependencyObject Visual UIElement FrameworkElement Page Shape TextBlock.
Классы Windows Presentation Foundation System.Object DispatcherObject ApplicationDependencyObject Visual UIElement FrameworkElement Page Shape TextBlock.
Классы Windows Presentation Foundation System.Object DispatcherObject ApplicationDependencyObject Visual UIElement FrameworkElement Page Shape TextBlock.
Microsoft TechDays Александр Шер Разработчик ООО «Айко»
Ресурсы WPF Два типа ресурсов WPF: объектные ресурсы (object resource) – определенный.NET-объект, который можно использовать многократно; ресурсы сборки.
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
Ресурсы. Стили. Анимация. Лекция 15. Ресурсы Стили Анимация.
Перегрузка операторов x = a + b результат 1-й операнд2-й операнд оператор По количеству операндов операторы делятся на: унарные (один операнд) бинарные.
©Павловская Т.А. (СПбГУ ИТМО) Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
Обобщения ( generics) Обобщения – это классы, структуры, интерфейсы и методы, в которых некоторые типы сами являются параметрами. Эти типы перечисляются.
Интерфейсы Лекция 4. Реализуйте очередь в виде списка, содержащую комплексные числа Реализуйте методы void Enqueue(Complex с ) – помещает число в очередь.
Высокоуровневые методы информатики и программирования Лекция 8 Свойства и операции классов.
Основы ООП и C# Работа с объектами и классами. Классы Класс специальный тип данных для описания объектов. Он определяет данные и поведение типа. Определение.
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
Microsoft TechDays Занятие 6 Создание приложений доступа к данным с помощью WPF Роман Здебский
Коллекции классов Лекция 12. С помощью коллекций вместо создания структур данных программист использует готовые структуры данных, не заботясь об их реализации.
Классы WindowsForms элементов управления для работы со структурами данных Control ListViewTreeViewListControl ComboBoxListBox CheckedListBox DataGridViewDataGrid.
Транксрипт:

Dependency Property Расширение разметки (Markup Extensions) Привязки (binding) Лекция 13

Свойства зависимости (Dependency Property) Расширение разметки (Markup Extensions) Привязка элементов Привязка данных Преобразование данных Конвертеры StringFormat Множественная привязка MultiBinding MultiValueCanverter StringFormat

Расширение обычных свойств Для Dependency Property важен не только и не столько очередность установки свойства, а способ установки Dependency Property фактически помнит значения, установленные каждым из способов, а WPF использует самое приоритетное значение. При очистке приоритетного значения WPF использует следующее по приоритету менее приоритетное значение Порядок и приоритет определения значения свойства зависимости : Установлено системой коррекции Установлено анимацией Установлено напрямую в XAML, коде или с помощью Binding Установлено с помощью TemplateParent ( триггер имеет приоритет перед простой установкой ) Установлено триггерами стиля Установлено триггерами шаблона Установлено в стиле Установлено в стиле по умолчанию ( темы ) Свойство унаследовано в визуальном дереве Значение по умолчанию ПриоритетПриоритетПриоритетПриоритет

Объявление и регистрация свойства public static readonly DependencyProperty MyProperty DependencyProperty.Register int public static readonly DependencyProperty MyProperty = DependencyProperty.Register("My", typeof(int), typeof(MainWindow), new FrameworkPropertyMetadata(20)); Создание обертки – обычного свойства.NET int My public int My { GetValueMyProperty get { return (int)GetValue(MyProperty); } SetValueMyProperty set { SetValue(MyProperty, value); } } Нельзя использовать в обертке свойства зависимости какую - либо дополнительную логику, поскольку WPF вызывает GetValue и SetValue напрямую, а при использовании в коде в основном вызываются обертки свойства, а не GetValue / SetValue. По соглашению свойство зависимости имеет суффикс Property, а свойство обертка – без нет PropertyMetadata ( наследники UIPropertyMetadata, FrameworkPropertyMetadata) задает : Значение по умолчанию Опции использования свойства зависимости ( например, возможность использования в анимации, наследование, использование двустороннего binding по умолчанию, влияние на отрисовку и процесс измерения элемента и т. д.) Методы отвечающие за корректировку значений свойства

Dependency Property

Свойства зависимости (Dependency Property) Расширение разметки (Markup Extensions) Привязка элементов Привязка данных Преобразование данных Конвертеры StringFormat Множественная привязка MultiBinding MultiValueCanverter StringFormat

Позволяет получить значение в зависимости от переданных параметров Определение Создать класс наследник от MarkupExtension Переопределить метод ProvideValue Пометить класс атрибутом [MarkupExtensionReturnType()] с указанием возвращаемого типа MarkupExtensionReturnType [MarkupExtensionReturnType(typeof(string))] MarkupExtension class MyExtension : MarkupExtension { public int MyProperty { get; set; } ProvideValue public override object ProvideValue(IServiceProvider serviceProvider) { return (MyProperty + 3).ToString(); } Использование ( по соглашению Extension можно опустить )

MarkupExtension

Свойства зависимости (Dependency Property) Расширение разметки (Markup Extensions) Привязка элементов Привязка данных Преобразование данных Конвертеры StringFormat Множественная привязка MultiBinding MultiValueCanverter StringFormat

Привязка данных (binding) – это отношение, которое сообщает WPF о необходимости извлечения некоторой информации из исходного объекта и использования его для установки свойства в целевом объекте. Целевое свойство – обязательно свойство зависимости Объект источник – абсолютно любой объект Поддерживает автоматическое обновление свойств при изменении объектов ( при наличии уведомления об изменении ) *

Объект Binding в XAML устанавливается для целевого свойства ElementName ElementName – задает имя элемента - источника Path Path – задает путь к свойству в объекте - источнике sliderValue Binding sliderValue WPF автоматически получает уведомления об изменении свойства источника и изменяет целевое свойство.

Привязка к элементу

Mode Задается свойством Mode OneWay OneWay – целевое свойство обновляется при изменении исходного свойства TwoWay TwoWay - целевое свойство обновляется при изменении исходного свойства, а исходное свойство обновляется при изменении целевого свойства OneTime OneTime – целевое свойство устанавливается один раз на основе начального значения исходного свойства. Далее целевое свойство не ихменяется OneWayToSource OneWayToSource – обратно OneWay. Исходное свойство обновляется при изменении целевого свойства. Целевое свойство никогда не изменяется. Default Default – OneWay или TwoWay, устанавливается при определении самого свойства. *

Направление привязки

UpdateSourceTrigger Задается свойством UpdateSourceTrigger PropertyChanged PropertyChanged – источник обновляется немедленно, когда изменяется целевое свойство LostFocus LostFocus – источник обновляется немедленно, когда элемент теряет фокус и целевое свойство изменилось Explicit Explicit – источник не обновится пока не будет вызван метод BindingExpression.UpdateSource(); BindingExpression be = slider.GetBindingExpression(Slider.ValueProperty); be.UpdateSource(); Default Default – поведение определено при задании свойства. Почти всегда это PropertyChanged, но для TextBox.Text – LostFocus.

Binding binding = new Binding(); binding.Source = slider; binding.Path = new PropertyPath("Value"); binding.Mode = BindingMode.TwoWay; textBlock.SetBinding( TextBlock.FontSizeProperty, binding);

Свойства зависимости (Dependency Property) Расширение разметки (Markup Extensions) Привязка элементов Привязка данных Преобразование данных Конвертеры StringFormat Множественная привязка MultiBinding MultiValueCanverter StringFormat

Выбор источника данных. Свойства Binding ElementName ElementName – имя элемента - источника при привязке к элементу WPF Source Source – имя объекта при привязке не к элементу WPF RelativeSource RelativeSource – задает источник связывания, относительно текущего элемента в визуальном дереве. DataContext DataContext – если источник объекта для Binding не установлено, по Binding ищет элемент в визуальном дереве, у которого установлено свойство DataContext и считает источником значение свойства DataContext Path Path – путь к свойству в объекте - источнике. Может быть не задан, тогда привязка осуществляется к самому объекту

Значения RelativeSource Self Self – ссылка на сам элемент FindAncestor AncestorType FindAncestor – поиск объекта заданного типа выше по визуальному дереву. AncestorType – указывает элемент какого типа ищется PreviousData PreviousData – предыдущий элемент в списке (ItemsControl) TemplatedParent TemplatedParent – используется в шаблоне. Обозначает элемент, к которому применен шаблон

Source Relative Source DataContext

Привязка к данным – это создание связи между двумя свойствами разных объектов Не обязательно визуальных Характеристики связи Источник и получатель Направление Динамичность ( один раз или постоянно ) Сложность ( один к одному или привязка к коллекции )

Для того, чтобы целевое свойство автоматически обновлялось необходимо, чтобы привязанное свойство - источник извещало о своем изменении Извещения об изменении Поддерживается всеми DependencyProperty INotifyPropertyChanged Частный класс должен реализовывать интерфейс INotifyPropertyChanged и вызывать событие PropertyChanget при изменении свойства ICollectionChanged ObservableCollection Коллекции должны реализовывать интерфейс ICollectionChanged. Например, коллекция ObservableCollection

Уведомления об изменении

Свойства зависимости (Dependency Property) Расширение разметки (Markup Extensions) Привязка элементов Привязка данных Преобразование данных Конвертеры StringFormat Множественная привязка MultiBinding MultiValueCanverter StringFormat

Конвертер – класс, преобразующий один тип в другой XAML использует их повсеместно Преобразование строки в объект IValueConverter Реализует IValueConverter Convert ConvertBack Методы Convert и ConvertBack Преобразование от источника к целевому свойству : object Convert(object value, Type targetType, object parameter, CultureInfo Culture) Преобразование от целевого свойства к источнику : object ConvertBack(object value, Type targetType, object parameter, CultureInfo Culture) ValueConversion Конвертер необходимо пометить атрибутом ValueConversion, указывающем типы между которыми происходит преобразование [ValueConversion(typeof(Product), typeof(int))]

ConverterParameter – дополнительный параметр. Любой объект ConverterCulture – культура конвертера Нужна для локализации

Для использования конвертера необходимо : Указать пространство имен, где находится конвертер Создать в ресурсах экземпляр конвертера ( обычно ) Использовать конвертер в Binding {Binding … Converter={StaticResource myconv} }

Конвертер

StringFormat Форматирование вывода (StringFormat): Text={Binding … StringFormat= Цена {0} руб } Можно использовать обычные шаблоны форматированного вывода строк Дополнительный параметр должен быть только один. Text={Binding … StringFormat= Цена {0} * {0} руб } Неверно Text={Binding … StringFormat= Цена {2} * {1} руб } Если параметр используется первым, то необходимо добавить пустые скобки {} Text={Binding … StringFormat={}{0} руб } Замена или дополнение конвертеру

StringFormat

Свойства зависимости (Dependency Property) Расширение разметки (Markup Extensions) Привязка элементов Привязка данных Преобразование данных Конвертеры StringFormat Множественная привязка MultiBinding MultiValueCanverter StringFormat

Привязка нескольких источников к одному целевому свойству MultiBinding Целевое свойство изменяется при изменении любого из свойств Необходимо использовать либо MultiValueConverter, либо StringFormat (.NET 4) StringFormat может использовать столько параметров, сколько объектов Binding содержится в MultiBinding. Очередность параметров соответствует очерёдности объектов Binding

IMultiValueConverter Реализует IMultiValueConverter Convert ConvertBack Методы Convert и ConvertBack Преобразование от источников к целевому свойству : [] object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) Преобразование от целевого свойства к источнику : [][] object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) Отличие от обычных конвертеров только во множестве values ( и соответственно типов )

MultiBinding MultiValueConverter StringFormat