2010-02-04 13 views
7

मैंने कई समाधानों की तलाश की है और कोशिश की है लेकिन अब तक उनमें से कोई भी मेरी समस्या का समाधान नहीं करता है। मैं एक्सडी दस्तावेज़ के रूप में संग्रहीत XML दस्तावेज़ से डेटा प्रदर्शित करने के लिए विजुअल स्टूडियो 2010/.NET4 में WPF से अंतर्निहित डेटाग्रिड का उपयोग कर रहा हूं।WPF डेटाग्रिड में xml को सही तरीके से कैसे बांधें?

मेरा कोड सभी ठीक चलाता है, और मैंने सत्यापित किया है कि XDocument मौजूद और सही है। हालांकि, डेटाग्रिड कोई डेटा प्रदर्शित नहीं करता है।

एक्सएमएल (स्पष्टता के लिए सरलीकृत) इस तरह दिखता है:

<DataGrid x:Name="LibraryView" Grid.Row="1" 
       DataContext="{Binding Path=TrackList}" ItemsSource="{Binding XPath=/data/track}"> 
    <DataGridTextColumn Header="Title" Binding="{Binding XPath=name}"/> 
    <DataGridTextColumn Header="Artist" Binding="{Binding XPath=artist_name}"/> 
    <DataGridTextColumn Header="Album" Binding="{Binding XPath=album_name}"/> 
    <DataGridTextColumn Header="Length" Binding="{Binding XPath=duration}"/> 
</DataGrid> 

सी # कि यह सिर्फ बैकअप लेता है एक नया XDocument (एक से डाउनलोड प्रदान करती है:

<data> 
    <track> 
    <id>211</id> 
    <name>Track Name</name> 
    <duration>156</duration> 
    <artist_id>13</artist_id> 
    <artist_name>Artist Name</artist_name> 
    <album_id>29</album_id> 
    <album_name>Album Name</album_name> 
    </track> 
... 
</data> 

मेरे XAML इस तरह दिखता है वेब सेवा) TrackList प्रॉपर्टी में (जो INotifyPropertyChanged लागू करता है)। इस पर कोई और प्रसंस्करण नहीं किया जाता है।

मैंने पहले XLinq का उपयोग करने का प्रयास किया है, एक क्वेरी परिणाम से जुड़ने के लिए, जो या तो (एक ही समस्या) काम नहीं करता है, इसलिए मैंने सोचा कि मैं संभावित रूप से छोटी गाड़ी लिंक कथन लिखने से बचने के लिए XPath दृष्टिकोण का प्रयास करूंगा, और कोशिश करें समस्या को खोजने के लिए।

मैं डेटाग्रिड को सही तरीके से प्रदर्शित करने के तरीके के बारे में विचारों से बाहर हूं। इस बारे में मेरी समझ है कि इसे कैसे काम करना चाहिए, इसकी स्पष्ट कमी है, इसलिए मैं किसी भी मदद की सराहना करता हूं।

संपादित करें: यह ध्यान देने योग्य है कि मेरे पास इनपुट डेटा प्रारूप के साथ कुछ लचीलापन है, क्योंकि मैं स्वयं कच्चे एक्सएमएल को डाउनलोड कर रहा हूं। मैं कुछ सुझावों का प्रयास करूंगा और देख सकता हूं कि मैं काम करने के लिए क्या कर सकता हूं।

उत्तर

9

मैं XLinq इस्तेमाल किया और ठीक से काम किया, एक XDocument के बजाय एक XElement का उपयोग कर:

XElement TrackList = XElement.Load("List.xml"); 
LibraryView.DataContext = TrackList; 

Xaml:

<DataGrid x:Name="LibraryView" ItemsSource="{Binding Path=Elements[track]}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Artist" Binding="{Binding Path=Element[artist_name].Value}"/> 
     <DataGridTextColumn Header="Album" Binding="{Binding Path=Element[album_name].Value}"/> 
     <DataGridTextColumn Header="Length" Binding="{Binding Path=Element[duration].Value}"/> 
    </DataGrid.Columns> 
</DataGrid> 
+0

यह संदेश के साथ एक अवैधऑपरेशन अपवाद उठाता है, "आइटम्स संग्रह का उपयोग करने से पहले आइटम संग्रह खाली होना चाहिए। यह डेटा कॉन्टेक्स्ट को असाइनमेंट करते समय या प्रॉपर्टी चेंज के लिए इवेंट हैंडलर में होता है, इसलिए कार्यान्वयन को रोकता है। संपादित करें: नहीं यह ' टी, मैं अपनी कॉलम परिभाषाओं के आस-पास को जोड़ना भूल गया। – IanGilham

+0

अपवाद मेरी गलती थी। यह ठीक काम करता है। – IanGilham

+0

ओह मैन, डीम्गिंग xaml अप्रिय हो सकता है। – Natxo

1

बाइंडिंग XPath केवल तभी प्रासंगिक है जब आप किसी एक्सएमएलएनोड (जैसे आप XmlDataProvider का उपयोग कर रहे हैं) के लिए बाध्यकारी हैं। here देखें।

XPath XDocument कक्षाओं के साथ काम नहीं करता है। XDocument के गुणों से जुड़ने का एकमात्र तरीका सामान्य पथ वाक्यविन्यास है, जो एक्सएमएल को अवगत नहीं है।

आपकी सर्वश्रेष्ठ शर्त या तो XmlDataSource का उपयोग करने के लिए है, या अपने एक्सएमएल दस्तावेज़ को एक्सडी दस्तावेज़ के माध्यम से एक पीओसीओ में परिवर्तित करें। यही कारण है कि बहुत सरल उपयोग कर रहा है LINQ:

XDocument doc = XDocument.Load(xmlFile); 

      var tracks = from track in doc.Descendants("data") 
        select new Track() 
           { 
            Name= track.Element("name").Value,  
            Duration= track.Element("duration").Value,  
            etc ... 
           }; 
LibraryView.ItemsSource = tracks; 
+0

लेकिन यह कैसे आप एक लोड होगा डेटाग्रिड में संपादन के लिए संपूर्ण एक्सएमएल दस्तावेज़। मेरा मतलब है, आप कुछ XML तत्वों और उनके गुणों को डेटाग्रिड कॉलम पर कैसे मैप करते हैं और केवल उन्हें संपादित करते हैं? –

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