Создание экземпляра вложенного класса в XAML

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

public class A
{
    public class B
    {
    }
}

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

<local:A.B ... />

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

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

В настоящее время я использую Silverlight 4 с VS2010.

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

3 ответа

Решение

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

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

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

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

<local:A+B />

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

ParentTypeName+Nested

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


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

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

В качестве имени элемента (как показано в вопросе), + не допускается, так как результат больше не будет действительным XML; + не является допустимым символом имени:
XAML - это 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

TBD, как указать свойства с этим синтаксисом. использование x:TypeArguments?

Другие вопросы по тегам