CompactFramework DataGridTableStyle - Binding to IBindingList collection

Ho passato un bel pò di tempo a cercare di capire perché definendo la DataGridTableStyle con le relative DataGridTextBoxColumn e aggiungendola alla DataGrid.TableStyles collection, le mie impostazioni non venivano mai applicate.

La DataGrid ha la proprietà DataSource impostata su una mia collection di oggetti di tipo BindingList<T> come segue:

BindingList<StorageUnit> storageUnits = new BindingList<StorageUnit>();

A parte il tempo perso perche avevo omesso di valorizzare la proprietà dataGridTableStyle.MappingName, poi scoperto l'arcano ho scritto così:

dataGridTableStyle.MappingName = "storageUnits";

ma purtroppo non funziona.

Girando girando ho trovato la soluzione, basta ricavare il nome dalla proprietà DataSource della DataGrid con il seguente codice:

DataGridTableStyle dataGridTableStyle = new DataGridTableStyle();
dataGridTableStyle.MappingName = this.dataGrid.DataSource.GetType().Name;

Andando di debugging, sapete cosa contiene la proprietà MappingName? Contiene il valore "BindingList`1".

Come dice qualcuno delle mie parti, "Che c'azzecca BindingList`1 con storageUnits?", muah.

WCF e CompactFramework - Primi passi

Questa settimana ho iniziato a lavorare con WCF per realizzare una SmartDevice application che deve connettersi a una applicazione esistente.

Naturalmente sto usando il CompactFramework 3.5 e ho scaricato il NETCFv35PowerToys.

Dopo aver creato un primo servizio WCF ospitato in una console application, ho utilizzato il NetCFSvcUtil per generare le classi proxy da utilizzare nell'applicazione Smart Client. Qui c'è da ricordarsi di aggiornare i file generati ogni qualvolta si modifica il servizio o il DTO, se ci fosse qualcosa di automatico sarebbe una manna.

Le classi proxy dei servizi contengono anche i DTO generati ma contengono le proprietà non nello stesso ordine in cui si presentavano nella classe di partenza, bensì in ordine alfabetico.

Per ovviare a questo, si può usare il parametro Order dell'attributo [DataMember] in modo da generare il DTO come l'originale.

Esempio: 

[DataContract]
public class StorageUnit
{
    [DataMember(Order = 0)] 
    public string Id { get; set; } 

    [DataMember(Order = 1)] 
    public string Description { get; set; } 

    [DataMember(Order = 2)] 
    public string MaterialId { get; set; } 

Fare attenzione alle proprietà che contengono valori nullabili che non vengono serializzati dal palmare, prima di usarle fare il test se il valore della proprietà è stato specificato, come riportato in questo post.

Per adesso tengo i servizi ospitati in una console application che mi aiuta in fase di debugging, poi li dovrò mettere su IIS, ho fatto qualche prova seguendo quanto riportato sul libro WCF Unleashed ma non riesco a farli funzionare, farò altri tentativi più avanti, chi avesse lumi sarebbe il benvenuto.

Ovviamente ho perso qualche giornata per capire perché non riuscivo ad accedere al servizio ospitato sul mio portatile dall'emulatore, causa ferie brevissime , poi ho trovato questo post e quest'altro che mi hanno aiutato.