Нові можливості x:Bind в UWP

Image
також розширень і безлічі інших речей, в Anniversary Update сильно розширили можливості компилируемых прив'язок (x:Bind). Давайте подивимося, що змінилося.
Зірочкою (*) будуть позначені можливості, вимагають нового SDK.
Колекції
Тепер ви можете використовувати синтаксис виду
{x:Bind Collection[0]}
, щоб прив'язуватись до певних елементів списку. Більш того, якщо вихідний список реалізує INotifyCollectionChanged, а Mode встановлений в OneWay або TwoWay, прив'язка буде оновлюватися при зміні списку (навіть якщо зміна не стосується прив'язаний елемент). Для використання цієї можливості список повинен реалізовувати
IList<T>
або
IVector<T>
.
Такий синтаксис доступний не тільки для списків, але також для словників і Map'ов —
{x:Bind Dictionary['Key']}
. Правда типом ключа може бути тільки string. Аналогічно списками, словник або Map може реалізовувати IObservableMap для оновлення прив'язок. Для екранування лапок у рядку використовується символ ^.
Attached Properties
З'явилася можливість прив'язуватися до значень Attached Properties. Наприклад,
{x:Bind MyButton.(Grid.Row)}
прив'яжеться до номера рядка, в якому знаходиться MyButton. Якщо Attached Property не оголошена в стандартному просторі імен, вам потрібно додати відповідний префікс із зазначенням потрібного namespace.
Перетворення*
На відміну від класичного Binding, x:Bind суворо типізований, і невалідні прив'язки видають помилки в compile-time. Але буває так, що ви прив'язується до властивості з якимось оголошеним типом, але саме властивість є об'єктом конкретного типу. І навіть якщо ви впевнені, що член, якого немає в базовому типі, є в його спадкоємця, просто так прив'язатися до цього члену ви не зможете. Для вирішення цієї проблеми в 1607 додали можливість кастингу —
{x:Bind ((MyObject) Property).Member}
або
{x:Bind Property.(MyObject.Member)}
(рекомендується перший варіант). Це також буває корисно для перетворення nullable у звичайний тип (наприклад, bool? -> bool).
BooleanToVisiblityConverter*
Тепер не потрібен. Булеві значення будуть неявно конвертуватися в Visibility. Нарешті.
Прив'язка до функцій*
Це, мабуть, сама потужна нова можливість x:Bind. Тепер ви можете прив'язуватися безпосередньо до її обчислене значень функцій. Наприклад,
{x:Bind MyNumber.ToString('F4')}
буде повертати MyNumber з 4 знаками після коми.
  • В якості аргументів ви можете передавати числа, рядки, булеві значення (x:True і x:False, null (x:Nul) і шляхи до ваших властивостями. До того ж, якщо Mode встановлений в OneWay або TwoWay, прив'язка буде оновлюватися при зміні аргументів.
  • Ви можете прив'язуватися і до статичних методів, використовуючи нотацію
    пространствоимен:Клас.Метод
    .
  • Для використання TwoWay-прив'язки вам буде потрібно вказати BindBack. Ця функція буде викликатися при зміні значення в інтерфейсі, і вона повинна приймати один аргумент (нове значення). Приклад —
    {x:Bind MyFunction(MyProperty), BindBack=Update}
Зрозуміло, є обмеження:
  • Функція повинна бути доступна в місці виклику
  • Перевантаження виконується за кількістю, а не типами аргументів. Тобто, обрана буде перша функція, що має відповідне кількість аргументів.
  • Передаються типи повинні точно співпадати з прийнятими.
  • Зворотний тип повинен точно збігатися із значенням властивості, до якого йде прив'язка.
Як ми бачимо, XAML, хоч і неспішно, але розвивається, що дуже радує. Цілком можливо, що в RS2 і RS3 теж додадуть що-небудь нове. А поки можна потихеньку освоювати нові речі і позбавлятися від непотрібного тепер коду.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.