Создание экземпляра вложенного класса в XAML - PullRequest
34 голосов
/ 24 ноября 2010

в файле XAML (пользовательский контроль WPF), есть ли способ сослаться на внутренний класс"B", определенный в другом классе "A"?

public class A
{
    public class B
    {
    }
}

Что-то вроде:

<local:A.B ... />

Этот синтаксис не работает, потому что "B" интерпретируется как свойство с именем "B" в классе "A".

Я пробовалболее экзотические синтаксисы, такие как "::" или "+", но, похоже, ни один из них не работает.

Я сейчас использую Silverlight 4 с VS2010 .

Заранее спасибо за помощь.

Ответы [ 3 ]

42 голосов
/ 14 ноября 2012

Этот вопрос довольно старый, и я не знаю, сработал ли бы он с версией WPF еще в 2010 году, но теперь вы можете заставить его работать, используя «настоящее» (внутреннее) имя вложенного типа.:

<local:A+B />

Если вы когда-либо смотрели дизассемблированный код, то вот так выглядят вложенные типы:

ParentTypeName+Nested
32 голосов
/ 24 ноября 2010

Я искал и искал, потому что, если это возможно, я хотел бы знать. К сожалению, я нашел это на msdn :

Ваш пользовательский класс не должен быть вложенным учебный класс. Вложенные классы и «точка» в их общем синтаксисе использования CLR мешают другим WPF и / или XAML функции, такие как прикрепленные свойства.

Итак, похоже, что вы не можете ссылаться на вложенный класс с помощью оператора точки. Что касается альтернативных способов попасть в этот внутренний класс через XAML, мне пока не повезло в моих поисках. : o (Но это довольно интересный вопрос, поэтому я продолжу поиск. Может быть, я найду удачу!: o)

4 голосов
/ 24 июня 2018

. относится к свойству ;не знаю, почему XAML также не может искать вложенный класс, но это не так.


Вложенный класс может быть представлен внутри строки (например, значение свойства), используя A+B вместо A.B:

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

В качестве имени элемента (как показано в вопросе), +не допускается, так как результат больше не будет действительным XML;+ не является допустимым символом имени:
XAML - это XML .
XML Spec - NameChar .

Таким образом, имя элемента не может напрямую описывать вложенный класс.
НО см. ОБНОВЛЕНИЕ ниже - альтернативный синтаксис, который решает эту проблему.


ОБНОВЛЕНИЕ
Согласно комментарию @ Artfunkel к одному ответу, это должно быть решением [Я не проверял]: * ​​1036 *

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

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

Как определить свойства с этим синтаксисом.Используйте x:TypeArguments?

...