UWP - связывание Enum отличий
Я столкнулся с очень интересной проблемой.
Предположим, у вас есть следующее содержимое страницы XAML в приложении UWP:
<ContentControl Content="{x:Bind ApplicationDataLocalityEnum}" />
<ContentControl Content="{x:Bind FontStyleEnum}" />
А в коде позади страницы содержатся следующие свойства:
public ApplicationDataLocality ApplicationDataLocalityEnum { get; } =
ApplicationDataLocality.Local;
public FontStyle FontStyleEnum { get; } =
FontStyle.Normal;
Ожидаемый результат будет, что приложение будет отображать "Local" и "Normal".
Фактический результат, однако, следующий:
В чем причина этого? Мне очень любопытно, но, хотя я пытался копаться в значениях отладчика в течение долгого времени, он никогда не обнаруживал ничего, что могло бы вызвать это.
Вы можете поиграть с моим примером проекта на GitHub.
1 ответ
Если вы посмотрите на источник FontStyle
(просто нажмите F12), вы найдете его в Windows.Foundation.UniversalApiContract.winmd
, Это не сборка.NET, а встроенная сборка, спроектированная в.NET. MSDN для IReference говорит:
При программировании на.NET этот интерфейс скрыт, и разработчики должны использовать класс Nullable. Все члены среды выполнения Windows, в которых базовая подпись IDL показывает IReference (с ограничением), вместо этого выставляются с использованием обнуляемого синтаксиса типа обнуляемого значения (например,? Bool).
Так почему это не работает?
Суть ответа в том, что это не тип.NET и не ведет себя как тип.NET. Имея в виду ToString()
изначально не реализовано, как будто это enum
но действует вместо этого как GetType().ToString()
, который объясняет вывод, который вы видите.
Почему они не заставляют это работать?
Чтобы исправить это на стороне платформы, типу потребуется механизм, позволяющий различать нумерации, структуры и делегаты. В случае структур и делегатов, вы ожидаете ToString()
возвращать GetType().ToString()
а не значение имени; так что это общее поведение является наиболее распространенным выбором среди вариантов.