WPFToolkit DataGrid

Andiamo ad esaminare questo componente che ha finalmente appianato un'esigenza sentita da molti programamtori WPF, poichè prima di esso bisognava ingegnarsi
usando il ListView e facendolo diventare multicolumn usando un GridViewer, soluzione non molto intuitiva.
 
 
Per prima cosa aggiungiamo un ElementHost ad un Windows Form, giusto per cambiare un pò lo scenario classico della WPF Application stand-alone.
 
private System.Windows.Forms.Integration.ElementHost WPFHost;
 
 
Poi definiamo la classe dello UserControl usando lo XAML inserendo semplicemente uno ScrollViewer e una Grid per l'impaginazione.
 
<UserControl x:Class="mynamespace.UserControlTest"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WPFToolkit.DataGrid="http://schemas.microsoft.com/wpf/2008/toolkit"
Height="400" Width="600">
<ScrollViewer>
<Grid Name="container"></Grid>
</ScrollViewer>
</UserControl>
 
Ora ci dedichiamo alla creazione del DataGrid utilizzando codice c#, poichè è molto più complesso rispetto allo XAML e poichè c'è poca documentazione in rete.
Inoltre per poter popolare un DataGrid dinamicamente e modificarne l'aspetto a run-time è l'unica possibilità.
 
 
 
UserControlTest ts = new UserControlTest();
this.WPFHost.Child = ts;
RowDefinition r1 = new RowDefinition();
r1.Height = new GridLength(140);
((UserControlTS)(this.WPFHost.Child)).container.RowDefinitions.Add(r1);
 
Dopo aver inserito lo UserControl nel nostro ElementHost procediamo a creare un DataGrid che avrà due colonne, una contenete un'immagine ed un'altra contente del testo.
Per ogni colonna è necessario specificare con un DataTemplate che tipo di oggetto dovrà contenere e visualizzare. per fare ciò si setta VisualTree con un FrameworkElement del tipo
desiderato ed il gioco è fatto. Il Binding invece viene assegnato con la SetBinding() direttamente al FrameworkElement utilizzando il nome di una property di una classe che definiremo successivamente.
 
DataGrid g = new DataGrid()
ResourceDictionary res = ((UserControlTS)(this.WPFHost.Child)).Resources;
g.CanUserAddRows = false;
g.CanUserDeleteRows = false;
g.CellStyle = (Style)res["datagridstyle"];
g.GridLinesVisibility = DataGridGridLinesVisibility.All;
g.AutoGenerateColumns = false;
g.ColumnHeaderStyle = (Style)res["datagridheaderstyle"];
g.BorderThickness = new Thickness(1, 1, 1, 1);
 
DataGridTemplateColumn templateColumnim = new DataGridTemplateColumn();
DataTemplate cellTemplateim = new DataTemplate();
FrameworkElementFactory cellTemplateFactoryim = new FrameworkElementFactory(typeof(System.Windows.Controls.Image));
Binding bindingim = new Binding("source");
cellTemplateFactoryim.SetBinding(System.Windows.Controls.Image.SourceProperty, bindingim);
cellTemplateFactoryim.SetValue(System.Windows.Controls.Image.WidthProperty, 20d);
cellTemplateim.VisualTree = cellTemplateFactoryim;
cellTemplateim.Seal();
templateColumnim.CellTemplate = cellTemplateim;
templateColumnim.Width = new DataGridLength(10, DataGridLengthUnitType.Star);
g.Columns.Add(templateColumnim);
 
DataGridTemplateColumn templateColumn = new DataGridTemplateColumn();
DataTemplate cellTemplate = new DataTemplate();
FrameworkElementFactory cellTemplateFactory = new FrameworkElementFactory(typeof(TextBlock));
Binding binding = new Binding("text");
cellTemplateFactory1.SetBinding(TextBlock.TextProperty, binding);
binding1 = new Binding("tag");
cellTemplateFactory1.SetBinding(TextBlock.TagProperty, binding);
binding1 = new Binding("ctx");
cellTemplateFactory.SetBinding(TextBlock.ContextMenuProperty, binding);
cellTemplate.VisualTree = cellTemplateFactory;
cellTemplate.Seal();
templateColumn.Width = new DataGridLength(90, DataGridLengthUnitType.Star);
templateColumn.CellTemplate = cellTemplate;
g.Columns.Add(templateColumn);
 
ora dopo aver definito lo scheletro del DataGrid, andiamo a definire la classe DataGridElem che rappresenta concettualmente una riga del DataGrid e in cui bisognerà inserire
tutte le property a cui si è fatto riferimento nei binding di cui sopra. ATTENZIONE a inserire i metodi get e set sugli attributi della classe, per farli divenire Property, poichè il Binding funziona
proprio utilizzando Property.
 
public class DataGridElem
{
 
public string text{ get; set; }
public object tag{ get; set; }
public ContextMenu ctx{ get; set; }
public System.Windows.Media.Imaging.BitmapImage source { get; set; }
}
 
Essendo il DataGrid solo un controllo di visualizzazione e non di storage, come tutti i controlli WPF, è necessario costruirsi un data back-end su cui far appoggiare il DataGrid. Così creiamo una lista
di DataGridElem che sarà la base dati del nostro DataGrid.
 
List<DataGridElem> DataGridData = new List<DataGridElem>();
 
Infine è consigliabile inserire un layer tra DataGrid e data back-end che permetta filtraggi e altro per ottenere ulteriori funzionalità, ecco quindi inserire un ListCollectionView e settarlo come ItemSource
del DataGrid.
 
ListCollectionView lcv = new ListCollectionView(DataGridData );
g.ItemsSource = lcv;
 
 
Non resta che assegnare il DataGrid al nostro "container" e il gioco è fatto
 
((UserControlTS)(this.WPFHost.Child)).container.Children.Add(g);

((UserControlTS)(this.WPFHost.Child)).container.SetRow(g,0);

 

 

Leggi articolo

Fonte: Article Marketing Italia

FixFix


Valutazione: 2.4/5 (13 votos)

cat Programmazione
tag




Creative Commons License Questo articolo è rilasciato con Licenza Creative Commons. E' consentita la ripubblicazione integrale senza modifiche inclusi links ed informazioni su autore e fonte quando presenti.


Login
   Registrati

Tecnologia
Internet
Scienza
Cultura e società
Economia e finanza
Viaggi e tempo libero
Top Top Users
Arch Archivio

Cosa è questo sito?
Domande frequenti
Disclaimer e abusi
Contatto
Chi sono

Contenuti gratuiti per il tuo sito e marketing virale
brasil Portoghese
Article Marketing Italia