【问题标题】:Nullable type in x:TypeArgumentsx:TypeArguments 中的可空类型
【发布时间】:2015-12-23 08:36:24
【问题描述】:

是否可以将可为空的类型传递给 XAML 泛型类型参数(x:TypeArguments)?

我有:

 <base:ControlBase
  x:TypeArguments="sys:Int32"
  ...

我需要 Int32 可以为空.. 像

<base:ControlBase
  x:TypeArguments="sys:Nullable<sys:Int32>"
 ...

这似乎是无效的 XML/XAML。

我也尝试将其声明为sys:Nullabe&amp;lt;sys:Int32&amp;gt;,错误是:

'sys.Nullable' 不是泛型参数的有效类型名称引用

【问题讨论】:

  • 来自docs for x:TypeArguments如果泛型约束本身使用泛型类型,则嵌套约束类型参数可以包含在括号 () 中。 如果这是正确的,您应该可以做x:TypeArguments="sys:Nullable(x:Int32)"。另请参阅XAML: Using Generic Types in XAML 2009
  • 那个也试过了,还是不行……
  • @PatrickHofman - 有趣,谢谢。它似乎应该来自文档。
  • 是的,很奇怪。其他人提出了另一个建议,但这也不起作用:(

标签: c# wpf xaml


【解决方案1】:

不,很遗憾,这是不可能的。你需要创建一个中间类来解决这个问题(我已经尝试了所有可能的方法,但它不起作用)。

<base:NullableInt32ControlBase ... >

NullableControlBase 是中间类:

public class NullableInt32ControlBase : ControlBase<int?>
{ }

【讨论】:

  • 有趣。您是否尝试过自定义 XAML 标记扩展来接管类型名解析,即 x:TypeArguments="{MyParse sys:Nullable&lt;sys:Int32&gt;}" 甚至 x:TypeArguments="{MyParser int?}"?我认为它必须正常工作,但如果你尝试过但又失败了,我很想知道为什么/发生了什么?
  • 不,我没有尝试,只是常规标记。问题下 dbc 的建议也无济于事。我很想看看是否可以按照描述的方式来做。
  • @quetzalcoatl 我尝试了你的建议。它给出了“严重性代码描述项目文件行抑制状态错误'{local'是一个未声明的命名空间。”在x:TypeArguments="{local:NullableMarkupExtension sys:Int32}"。由于该类确实存在,因此对命名空间的评估似乎不太有效。
  • 我得到了同样的结果。我还尝试将扩展名放在默认命名空间中(请参阅here, option 2)。扩展程序本身在所有其他地方都可以正常工作,但在x:TypeArguments 中却不行。似乎 directives 根本不接受标记扩展,我在这里失败了。例如,如果 x:Name 接受了标记扩展,我会非常惊讶。不知何故,我在考虑 TypeArguments 时没有考虑过。目前,我没有看到任何进一步的选择。顺便说一句,我尝试使用 Xaml 2006 而不是 2009。
  • @quetzalcoatl 感谢您的尝试。当前的实施似乎中断了。所以现在中间类似乎是唯一的解决方案了。
【解决方案2】:

应该这样做:

sys:Nullable`1[System.Int32]

Intellisende 和 Resharper 在这方面给你一个错误,但它应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    相关资源
    最近更新 更多