2009-09-15 4 views
24

तो जाहिर है कि मैं कुछ गलत कर रहा हूं, लेकिन मुझे डेटाटाइप संपत्ति का उपयोग करते समय काम करने के लिए HierarchicalDataTemplate (या यहां तक ​​कि केवल डेटा टेम्पलेट) नहीं मिल रहा है। मैंने समस्या का प्रदर्शन करने के लिए सबसे कम संभव WPF एप्लिकेशन बनाया है।मैं एक WPF डेटा टेम्पलेट पर डेटाटाइप संपत्ति का उपयोग कैसे करूं?

XAML:

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:System="clr-namespace:System;assembly=mscorlib" 
    xmlns:local="clr-namespace:WpfApplication1" 
    Title="Window1" Height="300" Width="300" Loaded="Window_Loaded"> 
    <Window.Resources> 
     <HierarchicalDataTemplate DataType="x:Type local:Foo"> 
      <TextBlock Text="I am a Foo" /> 
     </HierarchicalDataTemplate> 
     <HierarchicalDataTemplate DataType="x:Type System:String"> 
      <TextBlock Text="I am a String" /> 
     </HierarchicalDataTemplate> 
    </Window.Resources> 
    <Grid> 
     <TreeView Name="treeView1" ItemsSource="{Binding}" /> 
    </Grid> 
</Window> 

कोड:

namespace WpfApplication1 
{ 
    public class Foo 
    { 
     public string Name { get; set; } 
    } 

    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
     } 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
      var list = new List<object> { "a", 1, "b", 2, new Foo() { Name="Brian"}}; 
      treeView1.DataContext = list; 
     } 
    } 
} 

जाहिर है मैं इसे treeview में निम्नलिखित प्रदर्शित की उम्मीद कर रहा हूँ।

I am a string 
1 
I am a string 
2 
I am a foo 

लेकिन मेरा आवेदन वास्तव में निम्नलिखित प्रदर्शित करता है।

a 
1 
b 
2 
WpfApplication1.Foo 

अजीब बात यह है कि लगभग हर उदाहरण मैं वेब पर देखते हैं कि यह बहुत बात (मामूली बदलाव के साथ) करता है और कोई और इसके साथ एक समस्या हो रही किया जा रहा है है। फिर भी मैंने XAML को पुन: व्यवस्थित करने के अनगिनत विभिन्न तरीकों का प्रयास किया है और कुछ भी मदद नहीं करता है। मुझे आशा है कि एक और जोड़ी आंखें मदद कर सकती हैं।

उत्तर

35

आपका कोड ठीक है, लेकिन अपने डेटा प्रकार विशेषता मान घुंघराले ब्रेसिज़ में लिपटे होने की जरूरत है: यदि आप usin नहीं कर रहे हैं

<HierarchicalDataTemplate DataType="{x:Type local:Foo}"> 
    <TextBlock Text="I am a Foo" /> 
</HierarchicalDataTemplate> 
<HierarchicalDataTemplate DataType="{x:Type System:String}"> 
    <TextBlock Text="I am a String" /> 
</HierarchicalDataTemplate> 
+4

हाहा ... यह बहुत शर्मनाक है। 100% कोई रास्ता नहीं है कि मैं आप में से कोई भी कह रहा हूं कि मैंने इस पर काम करने में कितना समय लगाया :) –

+0

मैं * सोचता हूं * आप डेटाटाइप = "लोकल: फू" से भी दूर हो सकते हैं (एक्स: टाइप या घुंघराले ब्रेसिज़ के बिना) , तो शर्मिंदा मत हो। इसे बनाना एक आसान गलती है! –

+12

@ ब्रायन, डब्ल्यूपीएफ सीखने की वक्र में आपका स्वागत है। आप इनमें से कई में आ जाएंगे, उन्हें आपको नीचे जाने न दें। – user7116

2

आपने TreeView की ItemTemplate संपत्ति निर्दिष्ट नहीं की है।

<TreeView Name="treeView1" 
      ItemsSource="{Binding}" 
      ItemTemplate="{StaticResource MyResourceItemTemplate}" /> 

लेकिन आपके मामले में आप वास्तव में एक DataTemplateSelector कार्यान्वयन के लिए TreeView.ItemTemplateSelector संपत्ति के लिए लागू उपयोग कर सकते हैं: यह संपत्ति TreeView जो उपयोग करने के लिए DataTemplate, आपके मामले में आप एक अपने संसाधनों में परिभाषित निर्दिष्ट करना चाहते हैं बताता है प्रकार के आधार पर एक अलग टेम्पलेट का चयन प्रदर्शित करने के लिए ...

+0

मैं एक डब्ल्यूपीएफ नौसिखिया हूं, लेकिन मेरा मानना ​​है कि आइटम प्रकार मिलानों का विरोध करते समय आइटम टेम्पलेट की आवश्यकता नहीं है x: कुंजी मैचों। असल में, मैट का समाधान काम करता है ताकि यह मामला होना चाहिए। और हाँ, DataTemplateSelector मेरा अगला कार्य है। हालांकि, मुझे लगता है कि इस बार मुझे बेहतर भाग्य मिलेगा। आपके समय के लिए धन्यवाद। –

+1

डेटा प्रकार के लिए डेटा टेम्पलेट स्वचालित रूप से दिनांक प्रकार पर लागू किया जा सकता है, अगर सही तरीके से सेट किया गया हो। – Gqqnbig

3

इसके अलावा gierarchicalDataTemplate के आइटम्ससोर्स के साथ आप इसके बजाय डेटा टेम्पलेट का भी उपयोग कर सकते हैं।

+0

हाँ, असल में मैं अपने असली एप्लिकेशन में आइटमसोर्स का उपयोग कर रहा हूं, लेकिन फिर भी अच्छा बिंदु। –

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