2016-02-18 2 views
6

Ich habe die folgenden Arten erklärt:eine Datenvorlage Auswahl basierend auf Typ

public interface ITest { } 
public class ClassOne : ITest { } 
public class ClassTwo : ITest { } 

In meinem Viewmodel Ich erkläre und Initialisieren der Kollektion:

public class ViewModel 
{ 
    public ObservableCollection<ITest> Coll { get; set; } = new ObservableCollection<ITest> 
    { 
     new ClassOne(), 
     new ClassTwo() 
    }; 
} 

Meiner Ansicht I‘ m erklärt die folgenden ItemsControl

<ItemsControl ItemsSource="{Binding Coll}"> 
    <ItemsControl.Resources> 
     <DataTemplate DataType="local:ClassOne"> 
      <Rectangle Width="50" Height="50" Fill="Red" /> 
     </DataTemplate> 
     <DataTemplate DataType="local:ClassTwo"> 
      <Rectangle Width="50" Height="50" Fill="Blue" /> 
     </DataTemplate> 
    </ItemsControl.Resources> 
</ItemsControl> 

Was ich erwarte, ist ein rotes Quadrat mit einem blu gefolgt, um zu sehen e Platz statt, was ich sehe, ist die folgende:

enter image description here

Was mache ich falsch?

+1

Ich glaube, Sie wollen tatsächlich [Datatemplateselector] (https://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector%28v=vs.110%29.aspx) –

+0

@ChrisW. Direkt von diesem Link: _ "... Erstellen Sie einen DataTemplateSelector, wenn Sie mehr als ein DataTemplate für denselben Objekttyp haben und Sie möchten eine eigene Logik bereitstellen, um eine DataTemplate auszuwählen, die basierend auf den Eigenschaften jedes Datenobjekts angewendet wird. * * Beachten Sie, dass Sie, wenn Sie Objekte unterschiedlicher Typen haben, die DataType-Eigenschaft auf der DataTemplate ** festlegen können. "_ – kskyriacou

+0

Entschuldigung, ich dachte [ItemTemplateSelector] (https://msdn.microsoft.com/en-us/library/ system.windows.controls.itemscontrol.itemtemplateSelector% 28v = vs.110% 29.aspx), ich sollte sowieso nicht hier sein, erster schöner Tag seit dem Winter und meine Gedanken sind woanders, ich denke nicht einmal ich schaute tatsächlich auf die ganze Frage lol. Frühlingsgefühle, Prost. –

Antwort

7

Ihr Problem könnte durch knifflige XAML-Vorgänge verursacht werden. Insbesondere müssen Sie Type an DataType übergeben, aber Sie übergeben eine Zeichenfolge mit dem Namen des Typs.

Verwenden x:Type den Wert von DataType, wie so dekorieren:

<ItemsControl ItemsSource="{Binding Coll}"> 
    <ItemsControl.Resources> 
     <DataTemplate DataType="{x:Type local:ClassOne}"> 
      <Rectangle Width="50" Height="50" Fill="Red" /> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type local:ClassTwo}"> 
      <Rectangle Width="50" Height="50" Fill="Blue" /> 
     </DataTemplate> 
    </ItemsControl.Resources> 
</ItemsControl> 
+0

Funktioniert perfekt, Sie haben die geschweiften Klammern jedoch weggelassen ({x: Typ local: ClassOne}). Irgendeine Idee, warum, was ich benutzte, funktionierte nicht? – kskyriacou

+1

@kyriacos_k Ihre Funktion hat nicht funktioniert, weil die Eigenschaft 'DataTemplate.DataType' vom Typ' object' ist (im Gegensatz zu z. B. 'Style.TargetType' vom Typ' Type'). Daher wird 'local: ClassOne' als String interpretiert und nicht implizit in' Type' umgewandelt. – Clemens

+2

'x: Type' verhält sich genau wie' typeof() 'operator, also übergibt man an' DataType' einen 'Type' anstelle eines Namens Ihrer Klasse. - obwohl [Dokumentation] (https://msdn.microsoft.com/en-us/library/system.windows.datatemplate.datatype%28v=vs.110%29.aspx) besagt, dass es "Objekt" und Beispiele nicht akzeptiert 't use 'x: Type' –