2 messaggi dal 25 agosto 2010
Buongiorno a tutti.
Finalmente dopo tanti anni di winform mi sono deciso di passare a wpf.
Con l'uscita di Visual Studio 2010 ho iniziato a studiare xaml da zero.
Dopo prove e prove ho deciso di fare la prima applicazione seria in wpf.
Ho deciso di farla subito difficile in modo da fare esperienza e imparare il più possibile.
Così ho creato un navigation pane e vorrei che ad ogli click di bottone in basso a sinistra, appaia un menù diverso in alto a sinistra.
Così ho studiato come fare la treeview. Ho visto che potrei tranquillamente fare ad ogni click di pulsante
Treeview1.Items.Clear()
TreeView1.Items.Add("ccc")

In pratica pulire tutto e aggiungere a runtime il menù corrispondente. Però questo è semplice e così non imparo nulla.
Allora ho studiato come associare il controllo TreeView a una sorgente xml e ho scoperto l'xmldatasource.
Ho creato quindi un file xml chiamato Menu1.xml e ci ho messo dentro questo:
<items>

<item text="Testo 1" value="1">
<item text="SubTesto 1" value="1-1" />
<item text="SubTesto 2" value="1-2" />
<item text="SubTesto 3" value="1-3" />
</item>
</items>

L'xaml è così:
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<XmlDataProvider x:Key="xmlData" Source="Menu1.xml" XPath="/items" />
<HierarchicalDataTemplate
x:Key="childTemplate"
ItemsSource="{Binding XPath=item}">
<TextBlock Text="{Binding XPath=@value}" />
</HierarchicalDataTemplate>
</Window.Resources>
<Grid DataContext="{Binding Source={StaticResource xmlData},XPath=item}">
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel IsItemsHost="True" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
<TreeView ItemsSource="{Binding}" ItemTemplate="{StaticResource childTemplate}"
Height="146" HorizontalAlignment="Left" Margin="187,17,0,0" Name="TreeView1" VerticalAlignment="Top" Width="281" >
</TreeView>
</Grid>
</Window>


A questo punto mi chiedo come sia possibile cambiare a runtime, "al volo" il nome del file xml ad ogni click del pulsante. In pratica cliccando su button1 deve caricare il file menu1.xml, cliccando su button2 deve caricare menu2.xml e così via.
Come cambiare a runtime la stringa <XmlDataProvider x:Key="xmlData" Source="Menu1.xml" XPath="/items" />
in modo che diventi <XmlDataProvider x:Key="xmlData" Source="Menu2.xml" XPath="/items" /> ?

Spero di essere stato chiaro nella spiegazione. Linguaggio usato: VB.NET
Ringrazio in anticipo e buona giornata.
Piero.
Invece di usare una sorgente XML, che può essere comoda in certe situazioni, ma non in questa, usa una tua collezione di dati, che puoi mantenere lato codebehind.
Questa collezione deve essere di tipo ObservableCollection e puoi impostare ItemsSource sul treeview in diversi modi: datacontext, assegnazione dal codebehind.
Guarda qua
http://www.winfxitalia.com/script/25/Creare-Collezioni-Utizzabili-Binding-WPF.aspx
http://www.winfxitalia.com/articoli/presentation-foundation/wpf-binding-template-1.aspx
http://www.winfxitalia.com/articoli/presentation-foundation/wpf-binding-template-2.aspx

e se vuoi approcciare un'architettura più corretta, guarda qua:
http://www.winfxitalia.com/articoli/presentation-foundation/architettura-model-view-viewmodel-wpf.aspx

Ciao

Il mio blog
Homepage

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.