2010-08-03 6 views
10

Ich bin relativ neu in WPF, und es sieht so aus, als gäbe es wahrscheinlich eine Reihe von Möglichkeiten, dies zu tun, aber ich kann keine von denen bekommen, die ich versucht habe zu arbeiten.Mehrere Typen aus einer einzelnen Liste in einer WPF-ListBox anzeigen?

Ich habe eine ObservableCollection, die zwei verschiedene Typen enthält.

Ich möchte diese Liste an eine ListBox binden und verschiedene DataTemplates für jeden gefundenen Typ anzeigen. Ich kann nicht herausfinden, wie man die Datenschablonen basierend auf dem Typ automatisch umschaltet.

habe ich versucht, die Datatype-Eigenschaft des Datatemplate zu verwenden und versucht Control und einen Datatrigger, aber ohne Erfolg, entweder es nichts auftaucht, oder sie behauptet, es kann nicht meine Art finden ...

Beispiel Versuch unten:

Ich habe nur die eine Datenvorlage mit der ListBox gerade verdrahtet, 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)); 
    } 
} 

Antwort

6

Sie sagen, dass „sie behauptet, es kann nicht meine Art finden.“ Das ist ein Problem, das Sie beheben sollten.

Das Problem besteht höchstwahrscheinlich darin, dass Sie keine Namespacedeklaration im XAML erstellen, die auf Ihren CLR-Namespace und die Assembly verweist. Sie müssen in der XAML-Top-Level-Elemente, so etwas sagen:

xmlns:foo="clr-namespace:MyNamespaceName;assembly=MyAssemblyName" 

Sobald Sie dies tun, wird XAML wissen, dass etwas mit dem XML-Namespace-Präfix foo tatsächlich eine Klasse in MyAssemblyName im MyNamespaceName Namespace ist.

Dann können Sie diesen XML-Namespace im Markup verweisen, die den DataTemplate erstellt:

<DataTemplate DataType="{foo:Person}"> 

Sie können natürlich auch eine Vorlage Wähler bauen, aber das ist ein Stück cruft zu Ihrer Software hinzufügen, die nicht benötigt da sein. Es gibt einen Platz für Vorlagenselektoren in WPF-Anwendungen, aber das ist es nicht.

+2

+1 Sie haben Recht. Ich frage mich, warum ich diese sehr coole Option nie gesehen habe. Hier die msdn-Verbindung: http://msdn.microsoft.com/en-us/library/system.windows.datatemplate.datatype.aspx – HCL

+0

Der DataTemplateSelector scheint wie cruft, sobald ich das einbringe. Danke für den Vorschlag. Ich dachte mir, es muss einen einfachen Weg geben, das zu lösen, und Sie haben es zur Verfügung gestellt! – davisoa

+1

funktioniert nicht für mich, aber tut. Tippfehler? –

6

Sie haben eine DataTemplateSelector zu verwenden. Ein Beispiel finden Sie in here.

Addiontal Informationen über MSDN

+0

Das funktioniert wie ein Zauber! Vielen Dank! – davisoa

+1

Sie müssen keinen Vorlagenselektor verwenden. WPFs Standard-Vorlagenauswahlmethode führt genau das aus, was hier benötigt wird. –

Verwandte Themen