Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1909, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Disabilita cookie ShinyStat

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

WPF: utilizzare gli XML Literals di VB 2008 per generare documenti Xml da TreeView

In questo periodo sto sperimentando molte possibilità di utilizzo di LINQ in Windows Presentation Foundation. Quello che veramente ho sempre apprezzato di LINQ è proprio il suo essere utilizzabile nei confronti di una marea di tipologie di oggetti in .NET, controlli inclusi. In precedenti post vedemmo come utilizzare LINQ-to-Objects per iterare controlli Windows Forms, in questo post, invece, facciamo una cosa un po’ diversa: partiamo da una TreeView in Windows Presentation Foundation per creare un documento XML con LINQ to Xml a partire dai nodi della TreeView stessa. Per lo scopo, sfrutteremo ancora una volta la potenza delle embedded expression esclusive di Visual Basic 2008, che sono davvero fenomenali.

 

Per questa semplice dimostrazione, ho popolato una TreeView via XAML ma, con LINQ, sarà possibile ottenere lo stesso risultato finale anche se la TreeView è popolata in data-binding. Poche righe di XAML:

 

    <Grid>

        <TreeView Name="Tree1">

            <TreeViewItem Header="First node">

                <TreeViewItem Header="First sub-item"  Tag="Test first sub-item"/>

                <TreeViewItem Header="Second sub-item"  Tag="Test second sub-item"/>

            </TreeViewItem>

            <TreeViewItem Header="Second node">

                <TreeViewItem Header="First sub-item"  Tag="Test third sub-item"/>

                <TreeViewItem Header="First sub-item"  Tag="Test fourth sub-item"/>

            </TreeViewItem>

        </TreeView>

    </Grid>

che ci danno questo risultato:

 

 

Come nella TreeView di Windows Forms, possiamo utilizzare la proprietà Tag per caratterizzare ciascun elemento con qualcosa di nostro interesse (a me, per esempio, è servita per scrivere degli Uri).

Detto questo, c’è da considerare che ciascun nodo della TreeView espone una collection chiamata Items che può essere iterata, in quanto implementa la IEnumerable. Come possiamo quindi sfruttare questa possibilità con LINQ per generare un documento XML a partire da nodi e sottonodi contenuti nella TreeView? Per esempio, con un metodo di questo tipo:

 

    Sub GenerateXml()

 

        'Queries the treeview to dinamically generate XML nodes

        Dim xmlDoc As XDocument = <?xml version="1.0" encoding="utf-8"?>

                                  <Nodes>

                                      <%= From node In Tree1.Items _

                                          Let realNode = DirectCast(node, TreeViewItem) _

                                          Select <Node Name=<%= realNode.Header %>>

                                                     <%= From item In realNode.Items _

                                                         Let realItem = DirectCast(item, TreeViewItem) _

                                                         Select <Item Header=<%= realItem.Header %>

                                                                    Tag=<%= realItem.Tag %>/> %>

                                                 </Node> %>

                                  </Nodes>

 

 

        xmlDoc.Save(AppDomain.CurrentDomain.BaseDirectory + "Test.xml")

    End Sub

Dobbiamo considerare che, nonostante sia attiva l’inferenza, la clausola From node ottiene quest’ultimo oggetto come Object. Ciò posto, dobbiamo convertirlo in TreeViewItem, perchè noi sappiamo che di questo si tratta. Per farlo “in-query”, sfruttiamo la keyword Let che permette l’assegnazione di un oggetto a un identificatore temporaneo, quindi, per esempio, anche il risultato della conversione che dobbiamo fare. Fatto questo, possiamo recuperare le proprietà Header e Tag di nostro interesse. Ricordiamo, poi, che per salvare un file nella cartella dell’eseguibile dobbiamo sfruttare, in WPF, la proprietà AppDomain.CurrentDomain.BaseDirectory.

 

Fatto questo, il metodo genera il risultato che vedete in figura:

 

 

Ho voluto aprire il file in Internet Explorer per far capire come il file Xml sia stato correttamente creato. Il bello delle espressioni incorporate è che, in una circostanza di questo tipo, ci permettono di generare un documento Xml come quello visto a partire da “n” nodi e non solo dai 2 principali come quelli dell’esempio: il codice rimane invariato.

 

Alessandro

Print | posted on sabato 8 novembre 2008 21:45 | Filed Under [ Visual Basic Visual Studio 2008 Windows Presentation Foundation LINQ ]

Powered by:
Powered By Subtext Powered By ASP.NET