【问题标题】:UWP - binding Enum differencesUWP - 绑定枚举差异
【发布时间】:2017-01-10 23:38:06
【问题描述】:

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

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

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

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

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

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

预期的结果是,应用会显示“本地”和“正常”。

实际结果如下:

这背后的原因是什么?我对此非常好奇,但即使我尝试挖掘调试器值很长时间,它也从未发现任何可能导致这种情况的东西。

你可以玩弄我的sample project on GitHub

【问题讨论】:

  • 虽然我无法回答您的实际问题,但如果它给您带来问题并且您需要解决问题,那么最好创建一个值转换器,以便您可以正确显示它。不过会非常有兴趣看到真正的答案!
  • 是的,我知道 ValueConverter 有效,但我是出于好奇而问的,因为我真的无法弄清楚:-D。
  • 我一直在玩这个,到目前为止我可以看到它只发生在 ContentControl 中。使用标准 TextBlock/TextBox 时,所选的 FontStyle 会正确显示。这可能与 ContentControl 呈现其内容的方式有关,可能是一个错误。
  • 但是,如果您尝试使用带有 ItemTemplate 的 ListView 并在其中放置一个 TexBlock 并在那里绑定 Text 属性 - 它再次发生!我只是知道这是怎么回事:-D
  • 请不要将 ValueConverter 用于这样的事情。只需在您的代码隐藏类中创建 public string FontStyleString =&gt; FontStyleEnum.ToString();

标签: c# enums windows-runtime uwp winmd


【解决方案1】:

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

使用 .NET 编程时,此接口是隐藏的,开发人员应使用 Nullable 类。基本 IDL 签名显示 IReference(带有约束)的所有 Windows 运行时成员改为使用可空值类型的可空语法(例如,?bool)公开。

那么为什么它不起作用呢?

答案的核心是,这不是 .NET 类型,其行为也不像 .NET 类型。意思是 ToString() 本身并没有像 enum 那样实现,而是像 GetType().ToString() 一样运作,这解释了您所看到的输出。

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

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

【讨论】:

  • 但是是什么使FontStyleApplicationDataLocality 不同,例如,根据F12 也在Windows.Foundation.UniversalApiContract.winmd 中?
猜你喜欢
  • 2016-12-12
  • 2023-03-27
  • 1970-01-01
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多