Почему копия модели XAML может нарушить навигацию FlipView

В статье объясняется, почему навигация FlipView через вспомогательные технологии иногда не срабатывает при использовании структурных типов данных в XAML-приложениях.

Проблема с копиями структур

В рассмотренном примере данные страниц были описаны как WinRT-структура с полями-строками и другими значениями. Когда XAML получал элемент коллекции, он работал с копией этой структуры. Запрос на переход к элементу передавал другую копию с теми же значениями. Хотя значения в копиях совпадали, объектная идентичность различалась, и механизм распознавания того же объекта не срабатывал.

Когда нужна объектная модель

Если контролу важно различать именно отдельные объекты, а не только их значения, следует использовать класс (runtimeclass), который сохраняет ссылочную идентичность. Вариант с объектной моделью также позволяет реализовать свойства и события более гибко; автор упоминал, что часть шаблонного кода можно сократить средствами Windows Implementation Library, но сокращение кода не должно менять контракт различения элементов.

Практические рекомендации

  • Определите, требует ли контрол различения элементов по ссылочной идентичности или достаточно сравнения по значению.
  • Если нужна идентичность, используйте ссылочные типы (runtimeclass) вместо структур, чтобы гарантировать, что XAML и вспомогательные технологии будут ссылаться на один и тот же объект.
  • При оптимизациях кода сохраняйте семантику модели данных: уменьшение шаблонного кода не должно менять поведение контроля.
  • Учитывайте потокобезопасность: нельзя выводить общую потокобезопасность модели из поведения одного свойства-обработчика; в примере значения задавались только при конструировании, что тоже влияет на гарантии доступа.

Вывод: равенство значений структур не всегда заменяет идентичность объектов — при проектировании моделей для XAML важно выбирать тип, соответствующий требованиям контроля и вспомогательных технологий.