2010-08-03 6 views
10

मैं डब्ल्यूपीएफ के लिए अपेक्षाकृत नया हूं, और ऐसा लगता है कि ऐसा करने के तरीकों का शायद एक समूह है, लेकिन मैं उन लोगों में से कोई भी नहीं प्राप्त कर सकता हूं जिन्हें मैंने काम करने की कोशिश की है।एक WPF ListBox में एक ही सूची से कई प्रकार प्रदर्शित करें?

मेरे पास एक अवलोकन करने योग्य चयन है जिसमें दो अलग-अलग प्रकार हैं।

मैं इस सूची को एक सूची बॉक्स में बांधना चाहता हूं और प्रत्येक प्रकार के सामना के लिए अलग-अलग डेटा टेम्पलेट प्रदर्शित करना चाहता हूं। मैं इस बात के आधार पर डेटा टेम्पलेट्स को स्वचालित रूप से स्विच करने का तरीका नहीं समझ सकता।

मैं DataTemplate का डेटा प्रकार गुण का उपयोग करने का प्रयास किया है और ControlTemplates और एक DataTrigger का उपयोग कर प्रयास किया, लेकिन कोई लाभ नहीं हुआ है, या तो यह कुछ भी नहीं दिखाई देता है, या यह इसे अपने प्रकार नहीं मिल सकता है का दावा है ...

उदाहरण नीचे प्रयास करें:

मेरे पास केवल एक ही डेटा टेम्पलेट है जो सूचीबॉक्स में वायर्ड है, लेकिन यह भी काम नहीं करता है।

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> 

पीछे कोड:

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

उत्तर

6

आप कहते हैं कि Addiontal जानकारी "उसका दावा है कि यह मेरे प्रकार नहीं मिल सकता है।" यह एक समस्या है जिसे आपको ठीक करना चाहिए।

समस्या, सबसे अधिक संभावना है कि आप XAML में नामस्थान घोषणा नहीं बना रहे हैं जो आपके सीएलआर नेमस्पेस और असेंबली का संदर्भ देता है। आप XAML के शीर्ष स्तरीय तत्व में कुछ इस तरह रखना होगा:

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

एक बार जब आप ऐसा करते हैं, XAML पता चल जाएगा वास्तव में MyNamespaceName नाम स्थान में MyAssemblyName में एक वर्ग है कि XML नामस्थान उपसर्ग foo के साथ कुछ भी।

तो फिर तुम मार्कअप बनाया DataTemplate में है कि XML नामस्थान देख सकते हैं:

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

आप निश्चित रूप से एक टेम्पलेट चयनकर्ता का निर्माण कर सकते हैं, लेकिन वह अपने सॉफ़्टवेयर को cruft का एक टुकड़ा है कि की जरूरत नहीं है जोड़ने है वहाँ रहना। WPF अनुप्रयोगों में टेम्पलेट चयनकर्ताओं के लिए एक जगह है, लेकिन यह नहीं है।

+2

+1 आप सही हैं। मुझे आश्चर्य है कि मैंने कभी यह बहुत अच्छा विकल्प क्यों नहीं देखा है। यहां msdn-link: http://msdn.microsoft.com/en-us/library/system.windows.datatemplate.datatype.aspx – HCL

+0

डेटा टेम्पलेट चयनकर्ता इसे अंदर डालकर क्रूर जैसा प्रतीत होता है। सुझाव के लिए धन्यवाद। मैंने सोचा कि इसे हल करने का एक आसान तरीका होना चाहिए, और आपने इसे प्रदान किया है! – davisoa

+1

मेरे लिए काम नहीं करता है, लेकिन करता है। लेखन त्रुटि है? –

6

आप एक DataTemplateSelector उपयोग करना होगा। उदाहरण के लिए here देखें।

पर MSDN

+0

यह एक आकर्षण की तरह काम करता है! धन्यवाद! – davisoa

+1

आपको टेम्पलेट चयनकर्ता का उपयोग करने की आवश्यकता नहीं है; डब्ल्यूपीएफ की डिफ़ॉल्ट टेम्पलेट चयन विधि बिल्कुल वही है जो यहां जरूरी है। –

संबंधित मुद्दे