- •«Комп’ютерні технології та програмування»
- •Оглавление
- •Лабораторная работа 1 Знакомство с wpf
- •Теоретические сведения
- •1. Знакомство с редактором xaml
- •2.Создание приложения wpf
- •Контрольные вопросы
- •Лабораторная работа 2 Подробное введение в разработку приложений wpf
- •Теоретические сведения
- •1. Ознакомление с управлением проектами wpf в msVisualStudio
- •3) Создание обработчиков событий
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •2. Создание тестового приложения wpf
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 3 Макет программы и основные элементы управления
- •Теоретически сведения
- •1. Макет в wpf
- •2. Новые возможности wpf
- •3. Элемент управления Canvas
- •4. Элементуправления StackPanel
- •5. Элементуправления WrapPanel
- •6. Элемент управления DockPanel
- •7. Элемент Grid
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 4
- •Xaml и код, расширения разметки и ресурсы
- •Теоретически сведения
- •2. Ссылки на ресурсы в wpf
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 6 Свойства зависимости
- •Теоретически сведения
- •1. Особенности свойств clr
- •2. Наследование значений свойств зависимости
- •3. Присоединенные свойства
- •4. Метаданныесвойствзависимости
- •5. Проверка допустимости значения
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 7 Привязка данных
- •Теоретически сведения
- •1. Концепция привязки данных
- •2. Свойство DataContext
- •3. Основные понятия привязки данных
- •4. Синтаксис привязки данных
- •5. Привязка к элементам интерфейса пользователя
- •6. Привязка к xml
- •7. Привязка к коллекции
- •8. Преобразователи значений привязки данных
- •9. Проверкапривязкиданных
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
4. Синтаксис привязки данных
В классе Binding могут использоваться различные свойства. Чаще всего привязки задаются в коде XAML, поэтому я сосредоточусь на синтаксисе XAML. Однако следует отметить, что все, что можно сделать в XAML, также можно реализовать и в коде программной части на C#.
Самая простая форма привязки — это привязка к значению существующего элемента.
В этом примере используются две кнопки. Свойство Background первой кнопки (btnSource) обладает значением Yellow. Вторая кнопка использует первую кнопку (btnSource) в качестве источника привязки, при этом значение Background первой кнопки (btnSource) используется для задания свойства Background второй кнопки.
<Button x:Name="btnSource" Background="Yellow" Width="150" Height="30">Yellow BUtton</Button>
<Button Background="{Binding ElementName=btnSource, Path=Background}"
Width="150" Height="30">I am bound to be Yellow Background</Button>
Ипользованиесвойства Binding.Mode и Binding.UpdateSourceTrigger всинтаксисепривязки.
Мы просто добавляем в выражение привязки дополнительное свойство и его требуемое значение.
<TextBox x:Name="txtSource" Width="150" Height="30"/>
<TextBox Width="150" Height="30" Text="{Binding ElementName=txtSource,
Path=Text, Mode=TwoWay, UpdateSourceTrigger=LostFocus }"/>
5. Привязка к элементам интерфейса пользователя
При настройке привязки необходимо учитывать несколько моментов.
Какое свойство требуется привязывать?
К какому свойству требуется выполнить привязку?
Должна ли это быть привязка типа OneWay, TwoWay и т. д.? Если нужна привязка типа TwoWay или OneWayToSource, является ли исходное свойство свойством зависимости? Оно должно быть таковым, чтобы передавать привязку типа TwoWay или OneWayToSource.
Когда вы определились с этим, все становится просто как дважды два. В состав демонстрационного решения (рис. 7.2) входит проект BindingToUIElements, который при выполнении выглядит так:
Рис. 7.2 - Демонстрационная программа
В этом простом демонстрационном приложении иллюстрируются три различные привязки. Давайте кратко обсудим каждую.
Простая привязка к элементу (режим по умолчанию). В этом примере свойство Background одной кнопки используется как исходное значение для свойства Background второй кнопки.
Код выглядит так.
<!-- Простая привязка к элементу-->
<Label Content="Simple Element Binding" Margin="5,0,0,0" FontSize="14" FontWeight="Bold" />
<StackPanel Orientation="Horizontal" Margin="10,10,10,10" Background="Gainsboro">
<Label Content="Simple Element Binding"/>
<Button x:Name="btnSource" Margin="10,0,0,0" Background="Pink" Content="Im btnSource"/>
<Button Margin="10,0,0,0" Background="{Binding ElementName=btnSource,
Path=Background}" Content="Im bound to btnSource"/>
<Button Margin="10,0,0,0" Content="Im bound to btnSource, using long Binding syntax">
<Button.Background>
<Binding ElementName="btnSource" Path="Background"/>
</Button.Background>
</Button>
</StackPanel>
Болеесложнаяпривязка (режимпоумолчанию). В этом простом примере в качестве источника привязки используется свойство SelectedItem.Contentэлемента ComboBox. Значение свойства Background элемента Buttonизменяется в зависимости от значения свойства SelectedItem.Contentэлемента ComboBox.
Кодвыглядиттак.
<Label Content="More Elaborate Binding" Margin="5,0,0,0" FontSize="14" FontWeight="Bold" />
<StackPanel Orientation="Horizontal" Margin="10,10,10,10" Background="Gainsboro">
<Label Content="Choose a color"/>
<ComboBox Name="cmbColor" SelectedIndex="0">
<ComboBoxItem>Green</ComboBoxItem>
<ComboBoxItem>Blue</ComboBoxItem>
<ComboBoxItem>Red</ComboBoxItem>
</ComboBox>
<Button Margin="10,0,0,0" Background="{Binding ElementName=cmbColor,
Path=SelectedItem.Content}" Content="Im bound to btnSource"/>
</StackPanel>
Привязка TwoWay сиспользованиемUpdateSourceTrigger. В этом простом примере используются два элемента TextBox. Свойству Binding.Mode присвоено значение TwoWay, а свойству Binding.UpdateSourceTrigger — событие PropertyChanged. Это означает, что источник привязки будет обновляться при изменении значения второго элемента TextBox.
Код выглядит так.
<!-- Использование UpdateSourceTrigger/Mode-->
<Label Content="Using UpdateSourceTrigger/Mode" Margin="5,0,0,0" FontSize="14" FontWeight="Bold" />
<StackPanel Orientation="Horizontal" Margin="10,10,10,10" Background="Gainsboro">
<TextBlock TextWrapping="Wrap"
Text="This uses TwoWay Binding and UpdateSourceTrigger=PropertyChanged.
Type in one textbox then the other,and see them update each other" Width="400"/>
<TextBox x:Name="txtSource" Width="50" Height="25" Margin="5,0,0,0"/>
<TextBox Width="50" Height="25" Margin="5,0,0,0"
Text="{Binding ElementName=txtSource,
Path=Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged }"/>
</StackPanel>
