This is a mirror of official site: http://jasper-net.blogspot.com/

XAML И DATA BINDING: РАСШИРЕННЫЕ ВОЗМОЖНОСТИ РАЗМЕТКИ И СВЯЗЫВАНИЯ ДАННЫХ В SILVERLIGHT

| Wednesday, April 27, 2011
КОММЕНТАРИИ В XAML
Начнем с самого простого, но не менее полезного. Комментарии – помогают читать код, отключать/включать временно куски кода при отладке.

<!-- Это простой комментарий -->
Это тоже простой комментарий, но только внутри закомментирован некий код:
<!--<Image Margin="0,0,0,0" Source="Untitled-2.png" Stretch="Fill" x:Name="BackgroundPng"/>—>
Однако, учтите, что вложенные комментарии сделать не получится. Например, в данном примере внутрь тега Grid вложен комментарий, такая разметка выдаст ошибку:

<Grid>
       <!-- <TextBlock Text="{Binding Path=Name}" /> -->
</Grid>

На заметку
Для того чтобы закомментировать выделенный фрагмент кода, можно нажать сочетание клавиш CTRL+K+C, а для обратного эффекта нужно нажать CTRL+K+U.

ОПРЕДЕЛЕНИЕ КОНСТАНТ В XAML
В разметку XAML можно определять константы некоторых простых типов, например, string, int, bool. Для того чтобы можно было сделать требуется добавить namespace System в документ:

xmlns:sys="clr-namespace:System;assembly=mscorlib"

Теперь в разметке можно задать константы в Resources :

<UserControl.Resources>
<sys:String x:Key="OKText">OK</sys:String>
</UserControl.Resources>

Теперь это значение можно использовать по такому же принципу как и StaticResource:

<Button Content="{StaticResource OKText}" />

На заметку
Однако, по такому принципу нельзя определить в XAML константу типа DateTime.

ПЕРЕЧИСЛЕНИЕ В XAML
Довольно часто приходится применять в XAML перечисления (enum), которые в code-behind должны выглядеть следующим образом. Есть такое перечисление:

public enum MyLovelyEnum
{
Normal, Super, Simple
}

В code-behind использование было бы таким образом:

MyLovelyEnum Lovely = MyLovelyEnum.Normal | MyLovelyEnum.Super;

Так вот, в XAML данное определение будет выглядеть так:

Lovely="Normal,Super"

DATACONTEXT VS SOURCE (DATA BINDING)
В первую очередь хотелось бы показать применение свойства Source у объекта Binding. Дело в том, что можно использовать и свойство Source и DataContext.

<TextBox DataContext="{StaticResource productResource}" Text="{Binding Name}" />

Или вот второй вариант:

<TextBox Text="{Binding Name, Source={StaticResource productResource}}" />

Эффект от применения того или иного способа будет одинаковым, за исключением некоторого нюанса. Если используется DataContext, то его “действие” распространяется на все контролы расположенные ниже по иерархии в визуальном дереве (VisualTree). Такого не происходит, если использовать Source, то есть привязка, таким образом, происходит “точечно” или “целенаправленно”. Это оправдано, когда в контексте одной формы требуется использовать несколько поставщиков данных.

ELEMENTNAME BINDING
Название параметра ElementName в классе Binding говорит само за себя. Привязка осуществляется к именованному контролу. Вот простой пример привязки:

<StackPanel>
<TextBox Name="FirstTextBox" />
<TextBox Name="SecondTextBox" Text="{Binding Text, ElementName=FirstTextBox}" />
</StackPanel>

Такая привязка приведет к тому, что при изменении текста в поле TextBox с именем FirstTextBox незамедлительно изменится текст в у контрола с именем SecondTextBox. Обратного действа не произойдет, потому что по умолчанию такой важный параметр как Mode у Binding имеет значение OneWay (в одну сторону). Но если установить значение этого параметра TwoWay, то при изменении текста в любом из контролов, второй тут же получит измененное значение.

Еще одним немаловажным свойством, которое чаще всего пишется, но подразумевается по умолчанию – это свойство Path. Разметка типа:

Text="{Binding Text, ElementName=FirstTextBox}"

и

Text="{Binding Path=Text, ElementName=FirstTextBox}"

Posted via email from Jasper-net

0 comments: