Функции в x:Bind
Примечание.
Общие сведения об использовании привязки данных в приложении с {x:Bind} (и комплексное сравнение {x:Bind} и {Binding}) доступны в разделах Подробно о привязке данных и Расширение разметки {x:Bind}.
Начиная с Windows 10 версии 1607 {x: Bind} поддерживает использование функции на конечном этапе шаге пути привязки. Это позволяет делать следующее.
- Более простой способ достижения преобразования значений
- Способ привязки зависит от нескольких параметров
Примечание.
Чтобы использовать функции с {x:Bind}, минимальная целевая версия пакета SDK приложения должна быть 14393 или более поздней. Вы не можете использовать функции, когда приложение предназначено для более ранних версий Windows 10. Дополнительные сведения о целевых версиях см. в статье Адаптивный к версии код.
В следующем примере фон и передний план элемента привязаны к функциям для преобразования на основе параметра цвета.
<DataTemplate x:DataType="local:ColorEntry">
<Grid Background="{x:Bind local:ColorEntry.Brushify(Color), Mode=OneWay}" Width="240">
<TextBlock Text="{x:Bind ColorName}" Foreground="{x:Bind TextColor(Color)}" Margin="10,5" />
</Grid>
</DataTemplate>
class ColorEntry
{
public string ColorName { get; set; }
public Color Color { get; set; }
public static SolidColorBrush Brushify(Color c)
{
return new SolidColorBrush(c);
}
public SolidColorBrush TextColor(Color c)
{
return new SolidColorBrush(((c.R * 0.299 + c.G * 0.587 + c.B * 0.114) > 150) ? Colors.Black : Colors.White);
}
}
Использование атрибутов XAML
<object property="{x:Bind pathToFunction.FunctionName(functionParameter1, functionParameter2, ...), bindingProperties}" ... />
Путь к функции
Путь к функции определяется аналогично другим путям свойств и может содержать точки (.), индексаторы или приведения.
Статические функции можно указать с помощью синтаксиса XMLNamespace:ClassName.MethodName. Например, используйте приведенный ниже синтаксис для привязки к статическим функциям в коде программной части.
<Page
xmlns:local="using:MyNamespace">
...
<StackPanel>
<TextBlock x:Name="BigTextBlock" FontSize="20" Text="Big text" />
<TextBlock FontSize="{x:Bind local:MyHelpers.Half(BigTextBlock.FontSize)}"
Text="Small text" />
</StackPanel>
</Page>
namespace MyNamespace
{
static public class MyHelpers
{
public static double Half(double value) => value / 2.0;
}
}
Можно также использовать системные функции непосредственно в разметке для выполнения простых сценариев, таких как форматирование даты, форматирование текста, сцепление текста и т. д. Пример:
<Page
xmlns:sys="using:System"
xmlns:local="using:MyNamespace">
...
<CalendarDatePicker Date="{x:Bind sys:DateTime.Parse(TextBlock1.Text)}" />
<TextBlock Text="{x:Bind sys:String.Format('{0} is now available in {1}', local:MyPage.personName, local:MyPage.location)}" />
</Page>
Если режим — OneWay/TwoWay, то путь функции будет иметь обнаружение изменений, выполненных на нем, и привязка будет повторно оцениваться, если есть изменения в этих объектах.
Функция, привязанная к следующим требованиям:
- Будьте доступными для кода и метаданных. Таким образом, внутренняя / частная работа в C#, но C++/CX потребуется использовать открытые методы WinRT.
- Перегрузка основана на количестве аргументов, а не типах, и она попытается сопоставить с первой перегрузкой с таким количеством аргументов.
- Типы аргументов должны соответствовать передаваемым данным. Мы не делаем сужающие преобразования.
- Возвращаемый тип функции должен соответствовать типу свойства, использующему привязку.
Механизм привязки реагирует на уведомления об изменении свойств, активированные по имени функции, и при необходимости повторно оценивает привязки. Например:
<DataTemplate x:DataType="local:Person">
<StackPanel>
<TextBlock Text="{x:Bind FullName}" />
<Image Source="{x:Bind IconToBitmap(Icon, CancellationToken), Mode=OneWay}" />
</StackPanel>
</DataTemplate>
public class Person : INotifyPropertyChanged
{
//Implementation for an Icon property and a CancellationToken property with PropertyChanged notifications
...
//IconToBitmap function is essentially a multi binding converter between several options.
public Uri IconToBitmap (Uri icon, Uri cancellationToken)
{
Uri foo = new Uri(...);
if (isCancelled)
{
foo = cancellationToken;
}
else
{
if (this.fullName.Contains("Sr"))
{
//pass a different Uri back
foo = new Uri(...);
}
else
{
foo = icon;
}
}
return foo;
}
//Ensure FullName property handles change notification on itself as well as IconToBitmap since the function uses it
public string FullName
{
get { return this.fullName; }
set
{
this.fullName = value;
this.OnPropertyChanged ();
this.OnPropertyChanged ("IconToBitmap");
//this ensures Image.Source binding re-evaluates when FullName changes in addition to Icon and CancellationToken
}
}
}
Совет
Функции в x:Bind можно использовать для реализации тех же сценариев, которые поддерживались с помощью объектов Converter и MultiBinding в WPF.
Аргументы функции
Можно указать несколько аргументов функции, разделенных запятыми (,)
- Путь привязки — тот же синтаксис, что и при привязке непосредственно к объекту.
- Если режим — OneWay/TwoWay, то будет выполнено обнаружение изменений, а привязка повторно оценивается при изменении объекта.
- Константная строка, заключенная в кавычки, необходима, чтобы назначить ее в виде строки. Hat (^) можно использовать для экранирования кавычки в строках
- Константное число , например -123.456
- Логическое значение , указанное как "x:True" или "x:False"
Двустороновые привязки функций
В двустороннем сценарии привязки вторая функция должна быть указана для обратного направления привязки. Это можно сделать с помощью свойства привязки BindBack. В примере ниже функция должна принимать один аргумент, представляющий собой значение, которое будет быть возвращено модели.
<TextBlock Text="{x:Bind a.MyFunc(b), BindBack=a.MyFunc2, Mode=TwoWay}" />