2016-02-18 14 views
6

Mam ogłosił następujące typy:Wybór szablonu danych w oparciu o typ

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

W moim viewmodel mam uznającą i inicjowanie następujący zbiór:

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

Moim zdaniem ja” m deklarowania następujące 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> 

Czego spodziewać się czerwony kwadrat następnie blu e kwadratowe, zamiast tego, co widzę, jest następujący:

enter image description here

Co robię źle?

+1

myślę, że rzeczywiście chce [DataTemplateSelector] (https://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector%28v=vs.110%29.aspx) –

+0

@ ChrisW. Bezpośrednio z tego linku: _ ... utwórz DataTemplateSelector, gdy masz więcej niż jeden DataTemplate dla tego samego typu obiektów i chcesz dostarczyć własną logikę, aby wybrać DataTemplate do zastosowania w oparciu o właściwości każdego obiektu danych. * * Zauważ, że jeśli masz obiekty różnych typów, możesz ustawić właściwość DataType na DataTemplate **. "_ – kskyriacou

+0

Przykro nam, koleś, myślałeś [ItemTemplateSelector] (https://msdn.microsoft.com/en-us/library/ system.windows.controls.itemscontrol.itemtemplateselector% 28v = vs.110% 29.aspx), prawdopodobnie nie powinienem tu być, pierwszy miły dzień od zimy i mój umysł jest gdzie indziej, nie sądzę, żebym nawet faktycznie spojrzał na całe pytanie lol. Wiosenna gorączka, okrzyki. –

Odpowiedz

7

Twój problem może być spowodowany przez finnicky działania XAML. W szczególności musisz przekazać Type do DataType, ale przekazujesz ciąg znaków z nazwą typu.

Zastosowanie x:Type ozdobić wartość od DataType, tak:

<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

Działa doskonale dzięki, pominięto nawiasy klamrowe ({x: Type local: ClassOne}). Jakiś pomysł, dlaczego to, czego używam, nie działa? – kskyriacou

+1

@kyriacos_k Twój nie działał, ponieważ właściwość 'DataTemplate.DataType' ma typ' object' (w przeciwieństwie do 'Style.TargetType', który jest typu' Type'). Dlatego 'local: ClassOne' jest interpretowany jako łańcuch znaków i nie jest niejawnie konwertowany na' Type'. – Clemens

+2

'x: Type' działa tak samo jak operator' typeof() ', więc przechodzisz do' DataType' a 'Type' zamiast nazwy twojej klasy. - nawet jeśli [documentation] (https://msdn.microsoft.com/en-us/library/system.windows.datatemplate.datatype%28v=vs.110%29.aspx) stwierdza, że ​​trwa to "object" i przykłady don 't use 'x: Type' –

Powiązane problemy