Элемент 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" />
Как было выше сказано, 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, которая собственно и будет использоваться.