Классы Windows Presentation Foundation System.Object DispatcherObject ApplicationDependencyObject Visual UIElement FrameworkElement Page Shape TextBlock.

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



Advertisements
Похожие презентации
Классы Windows Presentation Foundation System.Object DispatcherObject ApplicationDependencyObject Visual UIElement FrameworkElement Page Shape TextBlock.
Advertisements

Классы 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.
Dependency Property Расширение разметки (Markup Extensions) Привязки (binding) Лекция 13.
Программирование на C# 4 и.NET 4 Лекция 15. WPF. Шаблон элемента управления Элементы управления WPF спроектированы таким образом, чтобы полностью отделить.
Классы 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.
Ресурсы WPF Два типа ресурсов WPF: объектные ресурсы (object resource) – определенный.NET-объект, который можно использовать многократно; ресурсы сборки.
Литература 1.Мэтью Мак-Дональд. Windows Presentation Foundation в.NET 3.5 с примерами на C# 2008 для профессионалов - Изд. Вильямс, Крис Андерсон.
Классы Windows Presentation Foundation - 1 System.ObjectDispatcherOjectApplicationDependencyObjectVisualUIElementFrameworkElementControlContentControlWindowButtonBaseButtonToggleButtonCheckBoxRadioButtonItemsControlSelectorListBoxListViewComboBoxTabContro
Михаил Черномордиков Developer Evangelist, Microsoft Россия
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
©Павловская Т.А. (СПбГУ ИТМО) Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
Обобщения ( generics) Обобщения – это классы, структуры, интерфейсы и методы, в которых некоторые типы сами являются параметрами. Эти типы перечисляются.
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
Классы Windows Presentation Foundation System.Object DispatcherObject ApplicationDependencyObject Visual UIElement FrameworkElement Page Shape TextBlock.
Основы ООП и C# Работа с объектами и классами. Классы Класс специальный тип данных для описания объектов. Он определяет данные и поведение типа. Определение.
Классы Windows Presentation Foundation System.Object DispatcherObject ApplicationDependencyObject Visual UIElement FrameworkElement Page Shape TextBlock.
Классы WindowsForms элементов управления для работы со структурами данных Control ListViewTreeViewListControl ComboBoxListBox CheckedListBox DataGridViewDataGrid.
Высокоуровневые методы информатики и программирования Лекция 9 Делегаты.
Транксрипт:

Классы Windows Presentation Foundation System.Object DispatcherObject ApplicationDependencyObject Visual UIElement FrameworkElement Page Shape TextBlock Control ContentControl Frame Window NavigationWindow ButtonBase Button RepeatButton ToggleButton CheckBoxRadioButton RangeBase Slider ProgressBar TextBoxBase TextBox RichTextBox ItemsControl MenuBase MenuContextMenu HeaderedItemsControl MenuItemToolbar TreeViewItem Selector TabControl ListBox ListView ComboBox TreeView ToolBarTray Panel GridCanvas ContentElement FrameworkContentElement FrameworkTemplateStyle NavigationService

Привязка данных (Data Binding) Механизм привязки данных – программная модель для установления связи между элементом управления и данными приложения. Привязка данных WPF устанавливает связь между свойством (зависимости) элемента управления и свойством отдельного объекта приложения, в том числе и другого элемента управления; свойством элемента управления и свойством текущего элемента в списке объектов. WPF поддерживает привязку свойств зависимостей элементов управления к различным источникам данных - к объектам CLR, включая объекты ADO.NET, к данным XML и объектам, связанным с веб-службами. Привязку можно настроить таким образом, чтобы при изменении данных автоматически обновлялись данные в источнике и элементах управления, если данные предоставляют соответствующие уведомления. Привязку можно определить как в коде, так и в разметке. Модель привязки данных WPF похожа на модель привязки данных Windows Forms. Концепция модели не изменилась, появилась дополнительная функциональность, модель стала более гибкой.

Компоненты привязки Привязка включает в себя как обязательные компоненты объект-источник данных (data source) и его свойство, с которым будет установлена связь; объект-приемник данных(data target) и его свойство (целевое свойство привязки), которое должно быть свойством зависимостей. При выполнении привязки дополнительно можно определить направление передачи данных; момент обновления данных; пользовательские методы преобразования данных при обмене данными между источником и приемником; пользовательские методы проверки корректности данных при обмене данными между источником и приемником. Большая часть этой информации передается модулю управления механизмом привязки WPF (WPF binding engine) через объект одного из классов Binding, MultiBinding или PriorityBinding.

Классы для работы с привязками Класс Binding описывает привязку для одного свойства источника данных. Класс Binding не содержит информации о целевом объекте привязки. Класс BindingExpression поддерживает соединение между источником привязки и целью привязки. Класс BindingOperations содержит статические методы для управления привязками. Классы Validation, ValidationRule и ValidationResult поддерживают правила проверки корректности данных в привязке. Object MarkupExtension BindingBase Binding MultiBinding PriorityBinding BindingOperations Expression BindingExpressionBase BindingExpression MultiBindingExpression PriorityBindingExpression ValidationValidationRule ExceptionValidationRule ValidationResult

Как указать источник данных Источник данных в привязке можно задать явно через свойства Source, ElementName или RelativeSource класса Binding или унаследовать по умолчанию от свойства DataContext. public Object Source { get; set; } Объект, который используется как источник данных. public string ElementName { get; set; } Источник данных – другой элемент управления приложения. В качестве значения можно использовать свойство Name элемента управления. publicRelativeSource { get; set; } Объект RelativeSource, определяющий относительное местоположение источника данных. Умолчание null. Обычно используется для связи между двумя свойствами одного и того же объекта или при определении привязки в стиле (style) или шаблоне (template). Можно установить значение только для одного из трех свойств ElementName, Source или RelativeSource, в противном случае будет брошено исключение.

Свойство Path класса Binding Через свойство Path объекта Binding можно передать имя свойства объекта-источника данных; имя свойства в случае, когда сам источник данных является свойством объекта- источника. Класс PropertyPath используется для описания свойств в привязке данных. В классе определены два конструктора public PropertyPath( Object parameter ); Параметр конструктора - путь к CLR свойству или отдельное свойство зависимости. public PropertyPath ( string path, Object[] pathParameters); Параметры конструктора - путь к CLR свойству в виде строки с разделителями и массив параметров. public PropertyPath Path { get; set; } public string Path { get; set; } Строка, которая описывает путь. public Collection PathParameters { get; } Список параметров для пути с индексаторами. и два свойства:

Привязка в коде. Пример Binding bd2 = new Binding(); bd2. Source = mdi; bd2. Path = new PropertyPath("DoubleValue"); slider_1.SetBinding(Slider.ValueProperty, bd2); textBox_2.SetBinding(TextBox.TextProperty, bd2); class DataItem : INotifyPropertyChanged { private string text; private double doubleValue; public DateTime Date { get; set; } public Point Point { get; set; } public Color Color { get; set; } public event PropertyChangedEventHandler PropertyChanged; public string Text { get { return text; } set { text = value; if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Text")); } public double DoubleValue { get { return doubleValue; } set { doubleValue = value; if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("DoubleValue")); } [ …code …] } В примерах источником данных является объект mdi класса DataItem. Привязка устанавливает связь между свойством Text элемента управления TextBox и свойством Date объекта mdi типа DataItem. Привязка устанавливает связь между свойством DoubleValue объекта mdi типа DataItem и свойствами Value элемента управления Slider и Text элемента управления TextBox. Binding bd1 = new Binding(); bd1. Source = mdi; bd1. Path = new PropertyPath("Date"); textBox_1.SetBinding(TextBox.TextProperty, bd1);

Источник данных, унаследованный от DataContext По умолчанию привязка наследует контекст данных, установленный через свойство DataContext элемента управления. Свойство DataContext определено в классе FrameworkElement. public Object DataContext { get; set; } Свойство DataContext является свойством зависимостей и может наследовать значение свойства родительского элемента - если для элемента управления локально или через стиль не установлено значение свойства DataContext, для него будет использовано значение из ближайшего родительского элемента. Явно указанный в привязке источник данных заменяет унаследованный контекст данных. В примере контекст данных определен для главного окна приложения. В привязке для элемента управления textBox_11 не указан источник данных, поэтому как источник используется mdi_2, который унаследован от родительского элемента управления как DataContext. this.DataContext = mdi_2; Binding bd = new Binding(); bd.Path = new PropertyPath("Text"); textBox_11.SetBinding(TextBox.TextProperty, bd);

Привязка в XAML. Пример […code…] <TextBox DataContext="{StaticResource mdi_Key2}" Text="{Binding Date}" Foreground="{Binding Brush}" Grid.Column="3" Height="25" Margin="10,20,12,0 /> В примере одним источником данных является объект пользовательского типа DataItem, который был добавлен в словарь ресурсов главного окна приложения с ключом mdi_Key1. Этот объект использован как значение свойства DataContext родительского элемента Grid, а затем его свойства DoubleValue и Text указаны в привязках к элементам управления Slider и TextBox. Для второго элемента управления TextBox как источник в привязках используется объект DataItem с ключом mdi_Key2. Этот объект установлен как значение свойства DataContext самого элемента TextBox. Его свойства Date и Brush связываются со свойствами Text и Foreground элемента управления.

Класс ObjectDataProvider Класс ObjectDataProvider дает возможность создать в XAML объект пользовательского типа, который инициализируется с использованием конструктора с параметрами. Созданный объект можно использовать в качестве источника привязки в XAML. В классе ObjectDataProvider определены свойства : ConstructorParameters для передачи параметров в конструктор объекта; MethodName для вызова метода и MethodParameters для передачи параметров в этот метод.

Класс ObjectDataProvider. Пример В примере в ресурсах главного окна создается объект DataItem, в классе которого определен конструктор с 4 параметрами. С помощью класса ObjectDataProvider параметрам конструктора передаются значения. Типы string, double и DateTime находятся в сборке mscorlib.dll в пространстве имен System. С этим пространством имен в открывающем тэге элемента связан префикс system:. Тип Point находится в сборке WindowsBase.dll в пространстве имен System.Windows. С этим пространством имен связан префикс spt:. < ObjectDataProvider x:Key="mdi_Key3" ObjectType="{x:Type zz:DataItem} " xmlns:system="clr-namespace:System;assembly=mscorlib " xmlns:spt="clr-namespace:System.Windows;assembly=WindowsBase"> ObjectDataProvider , /04/07 С объектом связан ключ mdi_Key3, который используется в привязках.

Как указать целевой объект привязки в коде В классах FrameworkElement и FrameworkContentElement определены методы SetBinding и GetBindingExpression – методы-оболочки, которые вызывают одноименные статические методы класса BindingOperations. public BindingExpressionBase SetBinding ( DependencyProperty dp, BindingBase binding ); Присоединяет объект binding, который описывает привязку, к элементу управления. public BindingExpression SetBinding ( DependencyProperty dp, string path ); Присоединяет привязку к элементу управления, используя для всех свойств привязки, кроме path, значения по умолчанию. public BindingExpression GetBindingExpression ( DependencyProperty dp ); Возвращает объект BindingExpression, если для целевого свойства есть привязка, null в противном случае.

Направление привязки TwoWay Целевое свойство обновляется при изменении свойства источника и источник данных обновляется при изменении целевого свойства. OneWay Целевое свойство обновляется при изменении свойства источника. OneTime Целевое свойство изменяется только один раз - при инициализации, т.е. при запуске приложения или при изменении DataContext. OneWayToSource Источник данных обновляется при изменении целевого свойства элемента управления. Default Тип привязки зависит от целевого свойства, например, для TextBox это TwoWay. Свойство принимает одно из значений перечисления BindingMode и определяет направление, в котором передаются данные. public BindingMode Mode { get; set; } Направление потока данных в привязке управляется свойством Mode класса Binding. В режимах OneWay и TwoWay автоматическое обновление элементов управления при изменении данных в источнике работает только в том случае, когда источник данных реализует интерфейс INotifyPropertyChanged.

Момент обновления значения в источнике public UpdateSourceTrigger UpdateSourceTrigger { get; set; } PropertyChanged Источник обновляется немедленно после изменения целевого свойства. LostFocus Источник обновляется после того, как элемент управления теряет фокус ввода. Explicit Источник обновляется только при явном вызове метода UpdateSource класса BindingExpression. Default Зависит от целевого свойства. Обычно значение по умолчанию - PropertyChanged. Свойство принимает одно из значений перечисления UpdateSourceTrigger: Привязки в режимах TwoWay и OneWayToSource обновляют данные в источнике в ответ на изменение свойства целевого элемента управления. Момент обновления источника управляется значением свойства UpdateSourceTrigger класса Binding. Значением по умолчанию для UpdateSourceTrigger для большинства свойств зависимостей является PropertyChanged. Значением по умолчанию для свойства Text в TextBox является LostFocus, так как обновление источника после ввода каждого символа уменьшает производительность.

Класс BindingExpression Класс Binding описывает привязку для отдельного свойства источника данных и дает возможность настроить характеристики привязки. Класс Binding не содержит информации о целевом объекте привязки. Связь между источником и целевым объектом поддерживает экземпляр класса BindingExpression. Один и тот же объект Binding можно использовать для создания нескольких привязок. Для каждой из них будет создан экземпляр BindingExpression, все они будут совместно использовать один и тот же объект Binding. Ссылку на объект BindingExpression можно получить как возвращаемое значение метода GetBindingExpression класса BindingOperations или класса FrameworkElement. Методы класса BindingExpression для явного обмена данными между источником и приемником: public void UpdateSource(); Обновляет данные источника в привязках TwoWay и OneWayToSource. public void UpdateTarget(); Обновляет значение целевого свойства элемента управления. Можно использовать для передачи данных в элемент управления в привязках OneWay или TwoWay, если источник не реализует интерфейс INotifyPropertyChanged.

Класс BindingExpression. Информация о привязке В классе BindingExpression определены свойства с информацией о привязке и ее состоянии. Некоторые свойства класса BindingExpression. public Object DataItem { get; } Объект источника привязки. public Binding ParentBinding { get; } Возвращает объект Binding для вызывающего BindingExpression. public BindingStatus Status { get; } Значение перечисления BindingStatus, которое описывает статус выражения привязки. В частности, перечисление имеет значения Active и PathError.

Класс BindingOperations public static bool IsDataBound ( DependencyObject target, DependencyProperty dp ); Проверяет, участвует ли заданное свойство в привязке к данным на текущий момент. public static Binding GetBinding ( DependencyObject target, DependencyProperty dp ); Возвращает объект Binding, связанный со свойством целевого объекта, или null. public static BindingExpression GetBindingExpression ( DependencyObject target, DependencyProperty dp ); Возвращает объект BindingExpression, связанный со свойством целевого объекта или null. public static void ClearBinding ( DependencyObject target, DependencyProperty dp ); Удаляет привязку, присоединенную к свойству объекта DependencyObject, и восстанавливает значение, которое имело свойство до выполнения привязки. public static void ClearAllBindings ( DependencyObject target ); Удаляет все привязки из указанного DependencyObject. public static BindingExpressionBase SetBinding ( DependencyObject target, DependencyProperty dp, BindingBase binding ); Создает новый экземпляр BindingExpressionBase и связывает его с заданным свойством цели привязки. Класс предоставляет статические методы для работы с привязками.

Преобразователи значений (converters) Механизм привязки по умолчанию использует преобразователь (default converter), который выполняет преобразование значений при передаче данных из источника в приемник. Если преобразование выполнить нельзя возвращается значение null. Пользовательское преобразование значений для привязки определяется в методах Convert и ConvertBack классов, реализующих интерфейс IValueConverter. Интерфейс IValueConverter : public interface IValueConverter { Object Convert( Object value, Type targetType, Object parameter, CultureInfo culture ); Object ConvertBack( Object value, Type targetType, Object parameter, CultureInfo culture ); } Механизм привязки данных WPF вызывает метод Convert при передаче данных из источника в приемник и метод ConvertBack при передаче данных в обратном направлении. Привязка не перехватывает исключения, брошенные пользовательскими преобразователями, они трактуются как ошибки времени выполнения. Если преобразователь значений не смог выполнить преобразование следует использовать в качестве возвращаемого значения DependencyProperty.UnsetValue, тогда механизм привязки данных использует значение FallbackValue, если оно определено, и значение default в противном случае.

Преобразователи значений. Пример В примере определен класс PointConverter, реализующий интерфейс IValueConverter, который выполняет пользовательское преобразование объектов типа Point к типу string. Для обратного преобразования используется преобразование по умолчанию. [ValueConversion(typeof(Point), typeof(string))] class PointConverter : IValueConverter { public object Convert( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { Point pt = (Point)value; return " x=" + pt.X + " y=" + pt.Y; } public object ConvertBack( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return value; } }

Преобразователи значений. Пример (продолжение) Объект класса PointConverter, добавлен в словарь ресурсов главного окна приложения с ключом ptConverter_Key. Преобразователь с ключом ptConverter_Key используется в привязке для элемента управления TextBox. <Window x:Class="Wpf_Binding_1_xaml.Window1" xmlns=" xmlns:x=" xmlns:yy="clr-namespace:Wpf_Binding_1" Title="Window1" Height="414" Width="498" Loaded="Window_Loaded"> […code…] <TextBox Text="{Binding Path=Point, Converter={StaticResource ptConverter_Key}}" Height="25" Margin="10,130,10,0" Name="textBox_13/>

Свойства класса Binding для определения пользовательских преобразователей значений Информация о пользовательском преобразователе передается через свойства объекта Binding: public IValueConverter Converter { get; set; } Преобразователь значений при передаче данных из источника в приемник. public CultureInfo ConverterCulture { get; set; } Региональные установки (культура), в которых выполняется преобразование значений. Умолчание null. public Object ConverterParameter { get; set; } Параметр, который передается Converter. Умолчание null. Использование в коде преобразователя значений из предыдущего примера : Binding bd = new Binding(); bd.Path = new PropertyPath("Point"); bd.Converter = new PointConverter(); textBox_conv_2.SetBinding(TextBox.TextProperty, bd);

Свойство FallbackValue класса Binding Свойство определяет значение для случая, когда привязка не может вернуть значение. Значение по умолчанию равно DependencyProperty.UnsetValue. Привязка возвращает значение, если путь к источнику данных успешно определен (resolve); преобразователь значений, если он определен, может выполнить преобразование; результирующее значение является корректным значением целевого свойства приемника. public Object FallbackValue { get; set; }