Одним из ключевых аспектов при разработке для WindowsPhone 8.1 является привязка данных. Она позволяет привязать свойство одного элемента к свойству другого. Например:
<StackPanel> <TextBlock x:Name="textBlock1" Text="{Binding ElementName=textBox1,Path=Text}" FontSize="26" Height="30" /> <TextBox x:Name="textBox1" Text="Привязка дан" /> </StackPanel>
Выражение Text="{Binding ElementName=textBox1,Path=Text}"
устанавливает привязку свойства Text элемента TextBlock к одноименному свойству Text элемента TextBox.
Для установки привязки используются конструкция {Binding ElementName=название_элемента,Path=свойство_элемента}
И если мы начнем изменять текст в текстовом поле, то автоматически он будет изменяться и в связанном элементе.
Таким образом, для установки привязки здесь используются свойства ElementName и Path, но кроме них у объекта Binding есть еще и другие свойства. Некоторые из них:
Некоторые свойства класса Binding
ElementName - имя элемента, к которому создается привязка
Mode - направление привязки
Может быть трех типов:
OneTime: привязка устанавливается только один раз, и после однократной установки привязки она уже не действует
OneWay: действует по умолчанию и предполагает автоматическое изменение значения свойства у одного объекта при изменении у другого
TwoWay: мы можем изменять свойства обоих объектов, и автоматически будет меняться свойство любого из связанных объектов, то есть двусторонняя привязка
Path - путь к данным объекта, например, свойство элемента
RelativeSource создает привязку относительно текущего объекта
Source указывает на объект-источник, если он не является элементом управления.
Для установки привязки в коде надо использовать класс Binding. Например, установим привязку в конструкторе страницы:
public MainPage() { this.InitializeComponent(); this.NavigationCacheMode = NavigationCacheMode.Required; // установка привязки Binding bind = new Binding(); bind.ElementName = "textBox1"; bind.Path = new PropertyPath("Text"); textBlock1.SetBinding(TextBlock.TextProperty, bind); }
Мы можем осуществлять привязку к объектам произвольных классов, в том числе к тем, которые создает сам разработчик. Например, добавим в проект следующий класс Tablet:
class Tablet { public string Name { get; set; } public string Company { get; set; } public int Year { get; set; } }
Теперь создадим объект этого класса и сделаем привязку к нему:
<Page x:Class="DataBindingApp.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:DataBindingApp" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Page.Resources> <local:Tablet x:Key="lenovo" Name="Lenovo Tab A8" Company="Lenovo" Year="2014" /> </Page.Resources> <Grid> <StackPanel> <TextBlock Text="Модель:" FontSize="26"/> <TextBlock Text="{Binding Source={StaticResource lenovo},Path=Name}" Margin="50 0" FontSize="26" x:Name="textBlock1" /> <TextBlock Text="Год выхода" FontSize="26"/> <TextBlock Text="{Binding Source={StaticResource lenovo},Path=Year}" FontSize="26" Margin="50 0" /> </StackPanel> </Grid> </Page>
Одним из способов задания привязке к объекту является использование контекста данных или свойства DataContext. С его помощью мы можем задать элементу какой-то общий контекст, а все его вложенные элементы будут привязаны к отдельным свойствам этого контекста. Посмотрим на примере выше. Для применения контекста данных перепишем его следующим образом:
<Page x:Class="DataBindingApp.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:DataBindingApp" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Page.Resources> <local:Tablet x:Key="lenovo" Name="Lenovo Tab A8" Company="Lenovo" Year="2014" /> </Page.Resources> <Grid DataContext="{StaticResource lenovo}"> <StackPanel> <TextBlock Text="Модель:" FontSize="26"/> <TextBlock Text="{Binding Name}" Margin="50 0" FontSize="26" /> <TextBlock Text="Год выхода" FontSize="26"/> <TextBlock Text="{Binding Year}" FontSize="26" Margin="50 0" /> </StackPanel> </Grid> </Page>
И теперь нам уже не надо явным образом указывать для каждого элемента используемый ресурс, так как он уже задан в качестве контекста данных для родительского контейнера.