c# – UWP – 绑定枚举差异

我遇到了一个非常有趣的问题.

假设您在UWP应用程序中有以下XAML页面内容:

<ContentControl Content="{x:Bind ApplicationDataLocalityEnum}" />
<ContentControl Content="{x:Bind FontStyleEnum}" />

在页面的代码隐藏中包含以下属性:

    public ApplicationDataLocality ApplicationDataLocalityEnum { get; } =
               ApplicationDataLocality.Local;

    public FontStyle FontStyleEnum { get; } = 
               FontStyle.Normal;

预期的结果是,应用程序将显示“Local”和“Normal”.

但实际结果如下:

c# –  UWP  – 绑定枚举差异

这背后的原因是什么?我对此非常好奇,但即使我已经尝试了很长一段时间来深入研究调试器值,它也从未透露任何可能导致此问题的内容.

你可以玩我的sample project on GitHub.

解决方法:

如果您查看FontStyle的来源(只需点击F12),您会发现它位于Windows.Foundation.UniversalApiContract.winmd中.这不是.NET程序集,而是投射到.NET中的本机程序集. MSDN for IReference说:

When programming with .NET, this interface is hidden and developers should use the Nullable class. All Windows Runtime members where the basic IDL signature shows IReference (with a constraint) are instead exposed using the nullable syntax of the nullable value type (for example, ?bool).

那为什么不起作用呢?

答案的核心是,这不是.NET类型,并且不像.NET类型.含义ToString()本身不是实现的,就像它是枚举一样,而是像GetType().ToString(),它解释了你看到的输出.

他们为什么不让它发挥作用?

要在平台方面纠正这种情况,类型需要一种机制来区分数字,结构和委托.在结构和委托的情况下,你会期望ToString()返回GetType().ToString()而不是名称值;所以这种通用行为是各种选择中最常见的选择.

上一篇:UWP以编程方式更改XAML页面的背景图像c#


下一篇:c# – 这是在Windows 10 UWP中获得呼叫程序集的最佳方法吗?