Главная » C#, Windows Runtime, XAML, Разработка для Windows 8 » Работа с данными Windows Runtime

0

Привязка к свойству элемента управления

Начнем с того, что для реализации привязки используется объект типа Binding. Независимо от того, связываете ли Вы элементы или элемент и данные, всегда используется именно Binding. При этом Binding можно совершенно спокойно использовать как в коде, так и в разметке XAML.

Естественно,  что использование Binding в  XAML — самая  распространенная ситуация. Для этих целей в XAML существует специальное расширение разметки, о котором мы немного уже упоминали в главе 4. Рассмотрим небольшой пример:

<Page x:Class="Chapter5_Binding.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">

<Grid Background="{StaticResource ApplicationPageBackgroundBrush}" VerticalAlignment="Center">

<StackPanel x:Name="LayoutRoot">

<Image Source="Assets/hydrangeas.jpg" Width="400">

<Image.Projection>

<PlaneProjection RotationY=

"{Binding Value, ElementName=slider}">

</PlaneProjection>

</Image.Projection>

</Image>

<Slider Minimum="0" Maximum="360" Name="slider" Width="400" Margin="10"></Slider>

</StackPanel>

</Grid>

</Page>

Тут мы создали элемент управления Image, который хотим «вращать»  по оси

Y.             Для  создания эффекта  размещения элемента в   трехмерном  пространстве используется объект PlaneProjection, содержащий свойство RotationY, которое задает угол поворота элемента по оси Y. Чтобы сделать наш интерфейс более динамичным,  вторым  элементом  мы  добавили ползунок,  который  и  будет задавать угол поворота. Тут мы используем два параметра:

·                   Path —  позволяет задать свойство  источника,  с  которым  происходит связывание. Поскольку это свойство является  свойством по умолчанию, то явно Path можно не писать;

·                   ElementName — задает имя элемента-источника;

В данном примере независимо от того, как Вы модифицируете свойство Value

бегунка, свойство RotationY будет обновляться автоматически.

Привязку можно реализовать и по-другому:

<Page x:Class="Chapter5_Binding.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">

<Grid Background="{StaticResource ApplicationPageBackgroundBrush}" VerticalAlignment="Center">

<StackPanel x:Name="LayoutRoot" >

<Image Source="Hydrangeas.jpg" Width="400">

<Image.Projection>

<PlaneProjection x:Name="projection"></PlaneProjection>

</Image.Projection>

</Image>

<Slider Minimum="0" Maximum="360" Name="slider" Width="400" Margin="10"

Value=

"{Binding RotationY, ElementName=projection, Mode=TwoWay}">

</Slider>

</StackPanel>

</Grid>

</Page>

В  этом  примере  в    качестве источника  выступает изображение.   Отличие состоит в  том, что, выполняя привязку ползунка к  изображению, мы указали дополнительное свойство Mode. Это свойство может принимать одно из трех значений:

·                   OneTime — значение свойства устанавливается  на основании значения свойства источника, но установка происходит лишь в  момент создания объектов. Любые изменения в будущем игнорируются;

·                   OneWay — значение свойства устанавливается  на основании  значения свойства источника. При изменении свойства источника будет обновляться свойство основного  объекта;

·                   TwoWay — значение свойства устанавливается  на основании  значения свойства  источника. При изменении свойства  источника или свойства основного  объекта, будут происходить взаимные обновления.

В нашем примере мы установили значение TwoWay свойству  Mode.  Таким образом, несмотря на то, что картинка является источником, ее поворот успешно задается ползунком.

Выбор источника зависит от конкретного приложения. Так, в примере выше выбор источника был не принципиален, но если мы решим добавить дополнительный элемент, модифицирующий значение угла поворота, то установить свойству два элемента Binding нам не удастся, а вот изменить направление привязки можно. Пример ниже расширяет наш интерфейс текстовым полем, которое также задает угол поворота.

<Page x:Class="Chapter5_Binding.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">

<Grid Background="{StaticResource ApplicationPageBackgroundBrush}" VerticalAlignment="Center">

<StackPanel x:Name="LayoutRoot">

<Image Source="Assets/hydrangeas.jpg" Width="400">

<Image.Projection>

<PlaneProjection x:Name="projection"></PlaneProjection>

</Image.Projection>

</Image>

<Slider Minimum="0" Maximum="360" Name="slider" Width="400" Margin="10"

Value=

"{Binding RotationY, ElementName=projection, Mode=TwoWay}">

</Slider>

<TextBox Width="200"  Text=

"{Binding RotationY, ElementName=projection, Mode=TwoWay}"></TextBox>

</StackPanel>

</Grid>

</Page>

Обратите  внимание, что  в    этом  примере  действие значения,   введенного в  TextBox, вступит  в  силу лишь при потере фокуса  элементом TextBox. Это связано с тем, что поведение  свойств при реализации привязки может отличаться. Чтобы задать поведение свойства, используют метаданные (атрибуты). В свою очередь, метаданные для TextBox заданы таким образом, что им нужна потеря фокуса текстового поля, чтобы произвести обновление. Для элемента TextBox это вполне обосновано.

Наконец, если Вы хотите установить привязку к данным в  коде, то это  также можно сделать без проблем. Вот как будет выглядеть код для TextBox из нашего примера:

Binding binding = new Binding(); binding.ElementName = "projection"; binding.Path = new PropertyPath("RotationY"); binding.Mode = BindingMode.TwoWay;

txtBox.SetBinding(TextBox.TextProperty, binding);

Перейдем теперь от привязки к элементам к привязке к объектам, которые не являются элементами управления.

Сергей Лутай, Сергей Байдачный, Windows 8 для C# разработчиков

По теме:

  • Комментарии