在XAML中创建嵌套类的实例

时间:2010-11-24 17:49:09

标签: wpf xaml inner-classes nested-class

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

public class A
{
    public class B
    {
    }
}

类似的东西:

<local:A.B ... />

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

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

我目前正在使用 Silverlight 4 VS2010

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:41)

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

<local:A+B />

如果你曾经看过一个反汇编的代码,那就是嵌套类型的样子:

ParentTypeName+Nested

答案 1 :(得分:32)

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

  

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

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

答案 2 :(得分:3)

.是指属性;不知道为什么XAML也不能搜索嵌套类,但不是。


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

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

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

因此元素名称不能直接描述嵌套类。
但是请参阅下面的UPDATE-解决此问题的另一种语法。


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

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

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

TBD如何使用该语法指定 properties 。使用x:TypeArguments