Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Приложения WinUI позволяют использовать функции в качестве завершающего шага пути привязки данных в расширении разметки {x:Bind}. Эта функция упрощает преобразование значений и позволяет привязкам зависеть от нескольких параметров, что делает приложение более динамическим и эффективным.
Подсказка
Общая информация об использовании привязки данных в приложении с {x:Bind} (а также о сравнении {x:Bind} и {Binding}), см. Раздел "Привязка данных подробно" и расширение разметки {x:Bind}.
В следующем примере фон и передний план элемента привязаны к функциям, выполняющим преобразование на основе параметра цвета.
<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>
public 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 Используйте синтаксис для указания статических функций. Например, используйте следующий синтаксис для привязки к статическим функциям в коде программной части.
<Window
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>
</Window>
namespace MyNamespace
{
static public class MyHelpers
{
public static double Half(double value) => value / 2.0;
}
}
Системные функции также можно использовать непосредственно в разметке для выполнения простых сценариев, таких как форматирование дат, форматирование текста, объединение текста и многое другое. Рассмотрим пример.
<Window
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)}" />
</Window>
Если для режима задано значение OneWay или TwoWay, путь функции поддерживает обнаружение изменений. Подсистема привязки повторно вычисляет привязку, если эти объекты изменяются.
Функция, которую вы собираетесь привязать, должна:
- Для доступа к коду и метаданным внутренние или приватные элементы работают в C#, но методы в C++ должны быть публичными методами 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)
{
var foo = new Uri(...);
if (isCancelled)
{
foo = cancellationToken;
}
else
{
if (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 fullName; }
set
{
fullName = value;
OnPropertyChanged();
OnPropertyChanged("IconToBitmap");
//this ensures Image.Source binding re-evaluates when FullName changes in addition to Icon and CancellationToken
}
}
}
Подсказка
Используйте функции в x:Bind, чтобы достичь тех же сценариев, которые поддерживались с помощью преобразователей и MultiBinding в WPF.
Аргументы функции
Укажите несколько аргументов функции, разделенных запятыми (,).
- Путь привязки — используйте тот же синтаксис, что и при привязке непосредственно к объекту.
- Если задать режим в OneWay или TwoWay, привязка обнаруживает изменения и переоценивает при изменении объекта.
- Константная строка, заключенная в кавычки, — включите кавычки, чтобы назначить ее строкой. Используйте шляпу (^), чтобы экранировать кавычки в строках.
- Константное число — например, -123.456.
- Логическое значение — укажите значение x:True или x:False.
Подсказка
TargetNullValue применяется к результату вызова функции, а не к связанным аргументам.
Двусторонняя привязка функций
В двустороннем сценарии привязки необходимо указать вторую функцию для обратного направления привязки. Используйте свойство привязки BindBack для этой функции. В следующем примере функция принимает один аргумент, который является значением, которое необходимо отправить обратно в модель.
<TextBlock Text="{x:Bind a.MyFunc(b), BindBack=a.MyFunc2, Mode=TwoWay}" />
См. также
Windows developer