Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Приложения 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