Элемент Bind

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

Элемент Bind в некотором отношении аналогичен Binding, только позволяет выполнить привязку к определенным свойствам страницы. Bind имеет ряд свойств, которые также определены в Binding: Path, Mode, TargetNullValue. Но в отличие от Binding x:Bind по умолчанию работает по режиму привязки OneTime, то есть привязка осуществляется только один раз. Хотя через свойство Mode можно изменить режим привязки.

Но главное отличие между Bind и Binding состоит в том, что выражение x:Bind выполняет код, который генерируется во время компиляции, а Binding обрабатывает привязки во время выполнения. В результате привязки Bind имеет большую производительность.

В качестве источника привязки элемент Bind использует страницу или элемент управления и устанавливает привязку к их свойствам и методам. Например, пусть в коде страницы MainPage имеется свойство Phone, которое ссылается на объект Phone:

public sealed partial class MainPage : Page
{
    public Phone Phone { get; set; }
    
	public MainPage()
    {
        this.InitializeComponent();

        Phone = new Phone { Company = "Microsoft", Price = 40000, Title = "Lumia 950" };
    }
}

С помощью Bind мы можем установить привязку к этому свойству:

<Page
    x:Class="BindingApp.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:BindingApp"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <TextBlock Text="{x:Bind Phone.Title}" />
    </Grid>
</Page>

Привязка к событиям

С помощью x:Bind мы можем привязывать методы объектов к событиям элементов управления. Так, пусть в классе Phone определен метод ShowModel():

public class Phone
{
    public string Title { get; set; }
    public string Company { get; set; }
    public int Price { get; set; }
	public async void ShowModel()
    {
        await new Windows.UI.Popups.MessageDialog(this.Title).ShowAsync();
    }
}

В данном случае метод просто выводит в окне осообщения название модели.

Тогда мы бы могли определить следующую кнопку, которая бы вызывала этот метод:

<Button Content="Показать модель" Click="{x:Bind Phone.ShowModel}" HorizontalAlignment="Center" />

Метод Bindings.Update

Как было выше сказано, x:Bind имеет ограничение в том, что он работает по типу привязки OneTime. А это значит, что если мы в процессе работы программы изменим значение свойства объекта, которое привязано к элементу управлению через x:Bind, то это изменение никак не повлияет на элемент. Поэтому нам надо отслеживать изменения объекта и при наличии изменений вызывать метод Bindings.Update(). Данный метод обновляет все привязки, которые используются в элементе управления.

Например, выведем в XAML информацию об объекте и установим кнопку изменения данных:

<Page
    x:Class="BindingApp.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:BindingApp"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="50" />
            <RowDefinition Height="50" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <TextBlock Text="Модель" />
        <TextBlock Text="{x:Bind MyPhone.Title}" Grid.Row="1" />
        <TextBlock Text="Производитель" Grid.Column="1"/>
        <TextBlock Text="{x:Bind MyPhone.Company}" Grid.Column="1" Grid.Row="1" />
        <TextBlock Text="Цена" Grid.Column="2" />
        <TextBlock Text="{x:Bind MyPhone.Price}" Grid.Column="2" Grid.Row="1" />
        <Button Content="Изменить" Click="Button_Click" VerticalAlignment="Top" HorizontalAlignment="Stretch"
                Grid.Column="2" Grid.Row="2" Margin="10" />
    </Grid>
</Page>

А в коде C# определим свойство MyPhone и обработчик нажатия кнопки:

public sealed partial class MainPage : Page
{
	public Phone MyPhone { get; set; }= new Phone { Company = "Microsoft", Price = 40000, Title = "Lumia 950" };

    public MainPage()
    {
        this.InitializeComponent();
	}

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        MyPhone.Price = 50000; // Меняем с 40000 на 50000
        Bindings.Update();
    }
}

Метод Bindings.Update() все привязки внутри текущей страницы. Без этого вызова мы не увидем изменения цены объекта.

При использовании объекта Bindings Visual Studio может определять данный объект как некорректный. Однако в данном случае не стоит на это обращать внимание, так как при компиляции будет создаваться переменная Bindings, которая собственно и будет использоваться.

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