Newsgroup: it.comp.dotnet
Titolo: Delucidazioni su Wpf

Ciao a tutti,
vi pongo il mio problema sperando in suggerimenti appropriati:
Ho un'applicazione funzionante con una winform dove vado a caricare in 
una TabControl tante schede quante sono le categorie e per ogni scheda 
vado a visualizzare una griglia di image per quanti sono i prodotti di 
qual settore.
Spero di avere reso l'idea.
La mia fonte dati è una Dictionary<settore, List<Prodotto>>.
Per caricare i dati dal db impiego e gestire la Di , circa 3 sec.
Per visualizzare la tabcontrol con le varie schede impiego circa 30 sec.
Allora mi son detto: Vediamo di approcciare il problema mediante wpf, 
con la speranza, che il caricamento della TabControl sia + veloce.
Ipotizzato che sia vero che con wpf si accorciano i tempi di caricamento 
della tabcontrol i dubbi cominciano ad assalirmi.
I problemi per uno che si è avvicinato da poco a wpf sono tanti.
Nel mio window.xaml aggiungo una Tabcontrol che chiamo Tab1.
    A questo punto a runtime devo inserire tante schede quanti sono i
    settori.
    Ad ogni scheda devo aggiungere una grid dove a runtime devo 
aggiungere tante celle, in orizzontale ed in verticale, quanti sono i 
prodotti di ogni settore.
In ogni cella devo mettere un'image con il nome del prodotto ed 
eventualmente una foto.
Bel malloppo, vero ?
Come si fa tutto ciò ?
Cosa devo bindare ? E come ?
Chi mi da una mano a chiarirmi le idee ?
Thanks.

 Cosa devo bindare ? E come ?
Gli items del tab control sono in binding con la lista di settori, 
dentro ogni Tab c'è un Template che contiene la griglia che è in 
binding con i prodott del sttore, definisci il template per le celle in 
modo da avere la visualizzazione delle immagini.
.m
-- 
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com/profile/mauro
blog @ 
http://milestone.topics.it
whynot [ at ] topics [ dot ] it

 avere la visualizzazione delle immagini.
Questo ultimo punto penso che sia legato alla grid

Nessuno che mi dia una risposta ?

 Nessuno che mi dia una risposta ?
Vedi se questo può aiutarti, giusto per capire che la strada è quella 
dei datatemplates (non devi aggiungere componenti lato codice c#).
Se ho tempo ti faccio qualche esempio più mirato per il tuo caso, per 
ora vedi se può andare questo:
http://www.wpftutorial.net/DataTemplates.html


Grazie, darò un'occhiata al link.


Ho cercato di capire il contenuto del Link, ma sinceramente, non ho 
trovato modo di avere risposte ai miei dubbi.
In particolare non riesco a bindare la griglia in quanto la 
List<Prodotto> della dictionary, cioè la parte Value della Dictionary.
Es. di dati:
             Cat ct = new Cat { NameCat = "cat1" };
             List<Prod> listA = new List<Prod>();
             listA.Add(new Prod{ Name = "pA1", Categ=ct });
             listA.Add(new Prod { Name = "pA2", Categ=ct});
             listA.Add(new Prod { Name = "pA3", Categ=ct});
             List<Prod> listB = new List<Prod>();
             listB.Add(new Prod { Name = "pB1" });
             listB.Add(new Prod { Name = "pB2" });
             listB.Add(new Prod { Name = "pB3" });
             listB.Add(new Prod { Name = "pB4" });
             listB.Add(new Prod { Name = "pB5" });
             listB.Add(new Prod { Name = "pB6" });
             List<Prod> listC = new List<Prod>();
             listC.Add(new Prod { Name = "pC1" });
             this.TheTabControl.ItemsSource = data;
Parte Xaml:
  <TabControl.ItemTemplate>
                 <DataTemplate>
                     <TabItem Header="{Binding Key}">
                         <ItemsControl ItemsSource="{Binding Value}">
                             <ItemsControl.ItemsPanel>
                                  <ItemsPanelTemplate>
                                      <Border HorizontalAlignment="Left" 
VerticalAlignment="Top" BorderBrush="Black" BorderThickness="2">
                                        <ScrollViewer 
VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" 
HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                                          <WrapPanel 
Background="LightBlue" Width="200" Height="Auto" Name="wrap1" >
                                                       ????????????????????
                                          </WrapPanel>
                                        </ScrollViewer>
                                      </Border>
                                 </ItemsPanelTemplate>
                             </ItemsControl.ItemsPanel>
                         </ItemsControl>
                       </TabItem>
                 </DataTemplate>
                 </TabControl.ItemTemplate>

                                  </ItemsPanelTemplate>
è giusto, cosa c'è che non va?
La lista di prodotti (Value) è l'ItemsSource dell'ItemsControl, questi 
vengono disposti con un WrapPanel. L'ItmesPanel serve solo per 
determinare come disporre gli elementi, se vuoi customizzare come viene 
rapprsentato ogni singolo elemento definisci un template anche per 
quello usando ItemsControl.ItemTemplate.


 Nessuno che mi dia una risposta ?
giusto per mettere i puntini sulle i su un newsgroup non esistono 
urgenze per quelle ci sono i consulenti a pagamento.



Lungi da me l'idea di richiedere urgenze di qualsiasi tipo.
Richiedevo un pò di aiuto, anche riferimenti a link utili per chiarirmi 
meglio le idee.
Thanks


  <ItemsControl ItemsSource="{Binding Value}">
                                 <WrapPanel Background="LightBlue" 
Width="200" Height="Auto" Name="wrap1">
                                 </WrapPanel>
                         </ItemsControl>
Il wrapPanel non lo vuole proprio e se lo tolgo è come se mi 
visualizzasse il metodo ToString() di della mia classe Prod.
Con il wrapPanel mi compare il seguente messaggio:
WrapPanel' object cannot be added to 'ItemsControl'. Operation is not 
valid while ItemsSource is in use. Access and modify elements with 
ItemsControl.ItemsSource instead.  Error at object 
'System.Windows.Controls.WrapPanel' in markup file 
'WpfApplication1;component/window2.xam
C'è qualcosa che mi sfugge:
Non riesce a risalire alla list<Prod> quando gli passo il Binding Value.
Credo che questa parte sia focale per poi capire il resto.
Io penso che molti avranno avuto i miei dubbi quando hanno approcciato 
il problema, come sto facendo io.
Thanks e buon lavoro.

 </ItemsControl>
come diceva mauro manca la parte che dice come renderizzare il singolo 
item, cioè serve un itemtemplate.
guardando qui:
http://stackoverflow.com/questions/1832719/wpf-itemspaneltemplate-not-working
anche se usa una listbox al posto del più generico itemscontrol puoi 
vedere che non devi aggiungere nulla, all'interno del tag "wrappanel", 
in più di quanto hai scritto, ma a parte devi dichiarare una cosa tipo:
<Itemscontrol.ItemTemplate>
             <DataTemplate>
                     <Image Source="{Binding Image}"/>
                     <TextBlock Text="{Binding Name}" />
             </DataTemplate>
</Itemscontrol.ItemTemplate>
(ho preso dall'articolo, guarda lì e estrapola, io non ho potuto fare 
una prova, spero che funzioni. Se ci sono ancora problemi fammi sapere)

 item, cioè serve un itemtemplate.
Ho inserito la seguente ma niente: Manca sempre l'informazione di come 
renderizzare i miei oggetti.
<ItemsControl.ItemTemplate>
             <DataTemplate>
                  <TextBlock Text="{Binding Prod.Name}" />
             </DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Per comodità ti invio l'oggetto che passo:
//create all
             Cat ct = new Cat { NameCat = "cat1" };
             List<Prod> listA = new List<Prod>();
             listA.Add(new Prod { Name = "pA1", Categ = ct });
             listA.Add(new Prod { Name = "pA2", Categ = ct });
             listA.Add(new Prod { Name = "pA3", Categ = ct });
             List<Prod> listB = new List<Prod>();
             listB.Add(new Prod { Name = "pB1" });
             listB.Add(new Prod { Name = "pB2" });
             listB.Add(new Prod { Name = "pB3" });
             listB.Add(new Prod { Name = "pB4" });
             listB.Add(new Prod { Name = "pB5" });
             listB.Add(new Prod { Name = "pB6" });
             List<Prod> listC = new List<Prod>();
             listC.Add(new Prod { Name = "pC1" });
             Dictionary<string, List<Prod>> dati = new 
Dictionary<string, List<Prod>>();
             dati.Add("A", listA);
             dati.Add("B", listB);
             dati.Add("C", listC);
             TheTabControl.ItemsSource = dati;

 </ItemsControl>
stai controllando se il binding va a buon fine? (tramite output window o 
converter o snoop o wpfinspector?)
allo scopo ecco qualche link:
http://bea.stollnitz.com/blog/?p=52
http://snoopwpf.codeplex.com/
http://www.wpftutorial.net/Inspector.html
probabilmente devi bindare a {Binding Prod/Name} o qualcosa di simile, 
ecco un altro link:
http://www.nbdtech.com/Free/WpfBinding.pdf

Ciao Romano,

come ti ha fatto vedere Marco, e detto io in precedenza, la soluzione è 
tutta nell'ItemTemplate dell'ItemsControl. Il WrapPanel serve solo ed 
esclusivamente come pannello per hostare gli elementi che vengono 
generati offrendoti una flessibilità che non ha eguali.



Grazie Marco dell'interessamento.Darò un'occhiata ai Link.
Spero di capirci di più del Wpf perchè lo vedo molto utile ed è per 
questo che sto sbattendo la testa sull'argomento cercandone di 
focalizzare la sua logica.


Grazie Mauro,
Il fatto è che ho la sensazione che mi manchi un piccolo tassello per 
focalizzare tutta la questione del binding su oggetti + o - complessi 
personalizzati e comincio ad avere la frenesia di ricercare questo 
tassello: Non so se ti capita anche a te.
Comunque grazie tanto.

              TheTabControl.ItemsSource = dati;
chiaro, ho provato, è il TabControl che ha un comportamento tutto suo:
<TabControl x:Name="myTabControl">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=Key, StringFormat=Categoria: 
{0}}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate>
            <ItemsControl ItemsSource="{Binding Path=Value}">
                <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <WrapPanel />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Margin="5" Text="{Binding Path=Name, 
StringFormat=Prodotto: {0}}" />
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>



Grazie.
Funziona.
Adesso cerco di capirne la logica.
Molte Grazie.