Привязка и контекст данных

Привязка данных

Последнее обновление: 31.10.2015

Одним из ключевых аспектов при разработке для WindowsPhone 8.1 является привязка данных. Она позволяет привязать свойство одного элемента к свойству другого. Например:

<StackPanel>
    <TextBlock x:Name="textBlock1" Text="{Binding ElementName=textBox1,Path=Text}"
                       FontSize="26" Height="30" />
    <TextBox x:Name="textBox1" Text="Привязка дан" />
</StackPanel>
Binding in Windows Phone 8.1

Выражение 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>

И теперь нам уже не надо явным образом указывать для каждого элемента используемый ресурс, так как он уже задан в качестве контекста данных для родительского контейнера.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850