【问题标题】:Creating an instance of a nested class in XAML在 XAML 中创建嵌套类的实例
【发布时间】:2011-05-15 06:27:57
【问题描述】:

XAML 文件(WPF UserControl)中,有没有办法引用另一个类“A”中定义的内部类“B”?

public class A
{
    public class B
    {
    }
}

类似:

<local:A.B ... />

此语法不起作用,因为“B”被解释为“A”类中名为“B”的属性。

我尝试了更多奇特的语法,例如“::”或“+”,但似乎都没有用。

我目前正在使用 Silverlight 4VS2010

提前感谢您的帮助。

【问题讨论】:

  • 不,它是一个命令,但可能是。
  • 我对 WPF 命令不是很熟悉,在回答这个问题时,点运算符是用来获取命令的:stackoverflow.com/questions/601393/custom-command-wpf 但是,命令是在不同的类中定义的。
  • 对于业务命令,这确实是标准方法,但我这里的命令是 UI 命令,不能在我当前 UI 之外的其他上下文中重用。
  • 这不是问题的直接答案,但我解决了一个非常相关的问题:我想将嵌套类实例传递给 &lt;d:Style.DataContext&gt; 标签(完全没有 d:DesignInstance 标记扩展,否则 VS设计师显示错误)。然后我发现我可以指定&lt;x:Type Type="nmspc:A+B" /&gt;,它也可以。也许这对某人有帮助。
  • . 指的是一个属性;不知道为什么 XAML 也不能搜索嵌套类,但事实并非如此。 在字符串中(例如属性值)可以表示嵌套类,使用+ 而不是.。作为元素名称(如问题所示),+ 是不允许的,因为结果将不再是有效的 XML; + 不是有效的名称字符。

标签: wpf xaml inner-classes nested-class


【解决方案1】:

这个问题已经很老了,我不知道它是否适用于 2010 年的 WPF 版本,但现在您可以使用嵌套类型的“真实”(内部)名称使其工作:

<local:A+B />

如果你看过反汇编代码,嵌套类型就是这样的:

ParentTypeName+Nested

【讨论】:

  • 在 Silverlight 中似乎不起作用。我得到一个“'+' 字符,十六进制值 0x2B,不能包含在名称中”解析器错误。
  • 我不确定您所说的“真实”或“内部”是什么意思,但元数据不会将封闭类的名称存储在与嵌套类名称相同的字段中,更不用说使用“+”作为分隔符。您看到的“+”是由反汇编程序添加的。
  • 具体来说,在字符串中(例如属性值)是可能的。作为元素名称(如答案所示),它是不允许的,因为结果将不再是有效的 XML; + 不是有效的名称字符。
  • 它有效!谁能找到任何有关+ 用法的官方文档/文章?我想了解更多
  • @kykzk46 - 您使用的确切语法是什么?您是在此答案中显示的 element name 中使用它,还是在我的评论和my answer 中提到的 string 中使用它?另外,您是否在 WPF 或 Xamarin Forms 或其他地方使用过 XAML?
【解决方案2】:

我一直在寻找和寻找,因为如果这是可能的,我想知道。不幸的是,我在msdn 上找到了这个:

您的自定义类不能是嵌套的 班级。嵌套类和“点” 在他们的一般 CLR 使用语法中会干扰其他 WPF 和/或 XAML 附加属性等功能。

因此,您似乎无法使用点运算符引用嵌套类。至于通过 XAML 访问该内部类的替代方法,我的搜索还没有任何运气。 :o(不过这是一个比较有趣的问题,所以我会继续寻找。也许我会找到一些运气!:o)

【讨论】:

  • 感谢您的回答。我害怕这种答案,但根据这句话,你似乎是对的。
  • 这是“一般”,但in my concrete code 我的 XAML 中有很多“点”。此外,它告诉“自定义类不能是嵌套类”,但问题不在于自定义类被嵌套,而是关于包含嵌套类的自定义类
  • 我认为奇怪的是,没有创建像“XAML 不支持嵌套类”或“不支持嵌套类”这样的警告。相反,您必须弄清楚并转到 Stack Overflow 这个。有点烦……
  • 但请参阅my answer 了解有时可以使用的解决方法。具体来说,虽然您确实不能使 元素名称 成为嵌套类(“.”总是被解释为“属性”,而“+”不是有效的 XAML),如果您可以编写使用嵌套类在字符串中 的 XAML,那么它可能是可能的(使用“+”而不是“.”)。
【解决方案3】:

. 指的是一个属性;不知道为什么 XAML 不能同时搜索嵌套类,但它不能。


嵌套类可以表示在字符串中(例如属性值),使用A+B而不是A.B

<Label SomeProperty1="{x:Static local:A+B.SomeProperty2}" />

作为元素名称(如问题所示),+ 是不允许的,因为结果将不再是有效的 XML; + 不是有效的名称字符:
XAML is XML
XML Spec - NameChar

所以元素名称不能直接描述嵌套类。
但请参阅下面的更新 - 解决此问题的替代语法。


更新
根据@Artfunkel 对一个答案的评论,这应该是一个解决方案[我还没有测试过]:

<x:Type TypeName="local:A+B"/>

发件人:https://docs.microsoft.com/en-us/dotnet/framework/xaml-services/x-type-markup-extension

待定如何使用该语法指定 属性。使用x:TypeArguments?

【讨论】:

  • 我用过,有效,这是正确答案。例如:&lt;DataTemplate DataType="viewModel:MyViewModel+MyNestedViewModel"&gt;
猜你喜欢
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 2023-03-31
  • 2020-10-22
  • 1970-01-01
相关资源
最近更新 更多