在XAML中创建嵌套类的实例

问题描述 投票:34回答:3

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

public class A
{
    public class B
    {
    }
}

就像是 :

<local:A.B ... />

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

我尝试了更多异国情调的语法,如“::”或“+”,但似乎都没有。

我目前正在使用带有VS2010的Silverlight 4。

在此先感谢您的帮助。

wpf xaml inner-classes nested-class
3个回答
32
投票

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

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

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


41
投票

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

<local:A+B />

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

ParentTypeName+Nested

3
投票

.是指财产;不确定为什么XAML也不能搜索嵌套类,但事实并非如此。


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

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

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

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


UPDATE Per @ Artfunkel对一个答案的评论,这应该是一个解决方案[我还没有测试]:

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

来自:https://docs.microsoft.com/en-us/dotnet/framework/xaml-services/x-type-markup-extension

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

© www.soinside.com 2019 - 2024. All rights reserved.