Я имею ObservableCollection<Object>
это содержит два различных типов.
Я хочу связать этот список с ListBox и отобразить другой DataTemplates для каждого типа, с которым встречаются. Я не могу выяснить, как автоматически переключить шаблоны данных на основе типа.
Я попытался использовать свойство DataType DataTemplate и делал попытку использования ControlTemplates и DataTrigger, но напрасно, или это ничто не обнаруживается, или это утверждает, что не может найти мои типы...
Попытка в качестве примера ниже:
У меня только есть один шаблон данных, соединенный проводом к ListBox прямо сейчас, но даже который не работает.
XAML:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<DataTemplate x:Key="PersonTemplate">
<TextBlock Text="{Binding Path=Name}"></TextBlock>
</DataTemplate>
<DataTemplate x:Key="QuantityTemplate">
<TextBlock Text="{Binding Path=Amount}"></TextBlock>
</DataTemplate>
</Window.Resources>
<Grid>
<DockPanel>
<ListBox x:Name="MyListBox" Width="250" Height="250"
ItemsSource="{Binding Path=ListToBind}"
ItemTemplate="{StaticResource PersonTemplate}"></ListBox>
</DockPanel>
</Grid>
</Window>
Код позади:
public class Person
{
public string Name { get; set; }
public Person(string name)
{
Name = name;
}
}
public class Quantity
{
public int Amount { get; set; }
public Quantity(int amount)
{
Amount = amount;
}
}
public partial class Window1 : Window
{
ObservableCollection<object> ListToBind = new ObservableCollection<object>();
public Window1()
{
InitializeComponent();
ListToBind.Add(new Person("Name1"));
ListToBind.Add(new Person("Name2"));
ListToBind.Add(new Quantity(123));
ListToBind.Add(new Person("Name3"));
ListToBind.Add(new Person("Name4"));
ListToBind.Add(new Quantity(456));
ListToBind.Add(new Person("Name5"));
ListToBind.Add(new Quantity(789));
}
}
Вы говорите, что "он утверждает, что не может найти мои типы". Это проблема, которую вам следует устранить.
Скорее всего, проблема в том, что вы не создаете в XAML объявление пространства имен, которое ссылается на ваше пространство имен CLR и сборку. Вам нужно поместить что-то вроде этого в элемент верхнего уровня XAML:
xmlns:foo="clr-namespace:MyNamespaceName;assembly=MyAssemblyName"
Когда вы это сделаете, XAML будет знать, что все, что имеет префикс пространства имен XML foo
, на самом деле является классом в MyAssemblyName
в пространстве имен MyNamespaceName
.
Затем вы можете ссылаться на это пространство имен XML в разметке, которая создала DataTemplate
:
<DataTemplate DataType="{foo:Person}">
Вы, конечно, можете создать селектор шаблонов, но это добавит в вашу программу кусок мусора, который там не нужен. В приложениях WPF есть место для селекторов шаблонов, но это не то место.
Вы должны использовать DataTemplateSelector. Смотрите здесь для примера.
Дополнительная информация на MSDN