Обращение к вложенным классам из XAML разметки
В XAML разметке есть список ListBox. Мне нужно, чтобы в зависимости от типа объекта, который передаётся в список из коллекции, выбирался шаблон, при помощи которого элемент будет отображаться в списке.
Список выглядит следующим образом:
<ListBox ItemsSource="{Binding ListItems}">
<ListBox.Resources>
<DataTemplate DataType="{x:Type local:People}">
<!-- Шаблон для типа People -->
</DataTemplate>
<DataTemplate DataType="{x:Type local:Car}">
<!-- Шаблон для типа Car -->
</DataTemplate>
</ListBox.Resources>
</ListBox>
В данном случае программа работает корректно. Но если я хочу обратиться к типу не напрямую из пространства имён (допустим, нужный мне класс находится внутри другого), то обратиться к данному классу и получить его я не могу.
К примеру, я хочу обратиться к классу A из библиотеки ALib, файла A.cs:
public class A
{
public class B
{
}
}
Так я подключу пространство имён и смогу обратиться к нужному мне классу.
xmlns:ans="clr-namespace:ALib;assembly=ALib"
...
<DataTemplate DataType="{x:Type ans:A}">
Но как мне обратиться к классу B в данном случае, учитывая, что в библиотеке ALib я не могу ничего менять?
Пробовал обращаться к классу B с помощью конструкции ans:A.B, но всё безуспешно.
Я только начал изучение WPF и XAML. Возможно, ответ очевиден, или есть более простое решение. Может вообще не стоит так делать. Если это так, предложите свои варианты. Буду очень благодарен.
Ответы (1 шт):
Вы можете использовать DataTemplateSelector .
public class TemplateSelector: DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
FrameworkElement element = container as FrameworkElement;
if (item.GetType() ==typeof(A) )
return element.FindResource("templateA") as DataTemplate;
else
return element.FindResource("templateB") as DataTemplate;
}
}
XAML
<Window.Resources>
<local:TemplateSelector x:Key="TemplateSelector"/>
</Window.Resources>
.
.
.
<ListBox ItemTemplateSelector="{StaticResource TemplateSelector}"/>