Mehrere Typen aus einer einzelnen Liste in einer WPF-ListBox anzeigen?

Ich habe einObservableCollection<Object> das enthält zwei verschiedene Typen.

Ich möchte diese Liste an eine ListBox binden und unterschiedliche DataTemplates für jeden gefundenen Typ anzeigen. Ich kann nicht herausfinden, wie die Datenvorlagen basierend auf dem Typ automatisch umgeschaltet werden.

Ich habe versucht, die DataType-Eigenschaft der DataTemplate zu verwenden und habe versucht, ControlTemplates und einen DataTrigger zu verwenden, aber ohne Erfolg, entweder wird nichts angezeigt, oder es wird behauptet, dass meine Typen nicht gefunden werden können ...

Beispiel Versuch unten:

Ich habe im Moment nur die eine Datenvorlage mit der ListBox verbunden, aber selbst das funktioniert nicht.

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>

Code Behind:

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));
    }
}

Antworten auf die Frage(4)

Ihre Antwort auf die Frage