Создание экземпляра вложенного класса в 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
?