2010-08-03 24 views
10

WPF'ye göreceli olarak yeniyim ve muhtemelen bunu yapmanın bir çok yolu var gibi görünüyor, ama çalışmayı denediğimden hiçbirini alamıyorum.WPF ListBox'ta tek bir listeden birden çok türü görüntüleme?

İki farklı türden oluşan bir GözlemlenebilirKoleksiyonum var.

Bu listeyi bir ListBox'a bağlamak ve karşılaşılan her tür için farklı DataTemplates görüntülemek istiyorum. Veri şablonlarını türüne göre otomatik olarak nasıl değiştireceğimi anlayamıyorum.

Ben DataTemplate FieldSize özelliği kullanmaya çalıştı ve ControlTemplates ve DataTrigger kullanarak denedi ama boşuna, ya da hiçbir şey gösterir, yoksa benim türlerini bulamıyorum iddia var ...

Örnek Aşağıdaki girişimi yapın:

Şu anda yalnızca bir adet veri şablonunu ListBox'a kabloluyorum, ancak bu çalışmaz.

XAML: Arkasında

<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> 

Kodu:

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

cevap

6

üzerinde

Addiontal bilgiler "bu benim türlerini bulamıyorum iddia ediyor." Bu düzeltmen gereken bir problem.

Sorun, büyük ihtimalle, CLR ad alanınıza ve derlemenize başvuran XAML'de bir ad alanı bildirimi oluşturmamanızdır. XAML üst düzey elemanı böyle bir şey koymak gerekir: Bu işlemi gerçekleştirdikten sonra, XAML XML ad alanı öneki foo ile şey MyNamespaceName ad alanında MyAssemblyName bir sınıf aslında bilecek

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

.

Sonra DataTemplate oluşturulan işaretlemesinde o XML ad alanını başvurabilirsiniz:

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

Kesinlikle bir şablon seçici inşa edebilirsiniz, ama bu gerekmez yazılım için cruft bir parça ekleyerek var orada ol. WPF uygulamalarında şablon seçiciler için bir yer var, ama bu böyle değil.

+2

+1 Haklısınız. Neden bu kadar havalı seçeneği görmediğimi merak ediyorum. Burada msdn-link: http://msdn.microsoft.com/en-us/library/system.windows.datatemplate.datatype.aspx – HCL

+0

DataTemplateSelector bunu yerleştirdikten sonra küstah gibi görünüyor. Öneriniz için teşekkürler. Bunu çözmenin kolay bir yolu olmalı diye düşündüm ve sağladın! – davisoa

+1

benim için çalışmaz, ancak yapar. Yanlış mı yazdınız? –

6

Bir DataTemplateSelector kullanmak zorunda. Örnek için bkz here. Söylüyorsun MSDN

+0

Bu bir çekicilik gibi çalışır! Teşekkürler! – davisoa

+1

Şablon seçicisini kullanmak zorunda değilsiniz; WPF'nin varsayılan şablon seçim yöntemi, tam olarak burada gerekenleri yapar. –

İlgili konular