Wednesday, September 30, 2009

Wpf: “Drag & Drop” Behavior, okkio :-)

Questo manuale proprio non mi va giù :-)
Pochissimi giorni fa ho introdotto nel mio toolkit un behavior per generalizzare la gestione del Drag & Drop, a breve il tutto probabilmente finirà su CodePlex, ma non è questo l’argomento odierno.
Houston abbiamo un problema
Nel post di cui sopra, per agganciare il behavior ad una ListView facevamo:
<ListView Margin="5" HorizontalAlignment="Stretch" 
          behaviors:DragDropManager.DataObject="{Binding Path=ItemsToDrag}"
          behaviors:DragDropManager.DataObjectType="myType"
          ItemsSource="{Binding Path=Items}">
Funzionare funziona ma ha l’effetto collaterale di permettere il drag & drop di qualsiasi cosa si trovi all’interno della ListView, compresi eventuali column header e scrollbar… poco simpatico :-)
Se ci pensiamo bene in realtà è giusto così, anche con un’implementazione “tradizionale” del drag & drop avremmo lo stesso problema, solo che con un’implementazione tradizionale possiamo discernere direttamente nell’handler chi sia la “cosa” che stiamo draggando mentre qui è un po’ più complesso.
Per ora però ho risolto così:
<ListView Margin="5" HorizontalAlignment="Stretch" 
          ItemsSource="{Binding Path=Persons}">
    
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
            <Setter Property="behaviors:DragDropManager.DataObject" Value="{Binding}" />
            <Setter Property="behaviors:DragDropManager.DataObjectType" Value="mySampleType" />
        Style>
    ListView.ItemContainerStyle>
Wpf & Styles rulez!!!
Sposto cioè l’assegnazione del behavior sui singoli ListViewItem e il problema scompare, l’effetto collaterale di questa cosa per ora è che non c’è mezzo di draggare più item(s) insieme, ma non mi serve. Ho anche in mente un altro paio di possibilità e miglioramenti, vedremo.
.m

Tuesday, September 29, 2009

UI Composition :: Una “region” dentro un Popup

Non si può.
Il motivo è abbastanza semplice, esiste uno ed un solo “Region Service”, per ciclo di vita dell’applicazione, che è il main entry point per accedere al mondo delle region, dato un Region Service e una View è possibile ottenere un Region Manager che è colui che gestisce le region per una data View; come minimo quindi esiste un Region Manager per ogni View che ospita delle region.
La procedura di registrazione delle region è abbastanza semplice e viene fatta dalla MarkupExtension che lo sviluppatore utilizza nello xaml:
<StackPanel rg:RegionService.Region="{rg:PanelRegion Names=”MyRegion”}}" />
Quando, a runtime, viene fatto il parsing dello xaml, del baml in realtà ma è un dettaglio irrilevante, viene istanziata anche la vostra MarckupExtension e viene chiamato il metodo ProvideValue( IServiceProvider ) che ha il compito di ritornare un’istanza di “qualcosa” di sensato per il contesto in cui viene usato, in questo caso quindi come minimo di una IRegion. Quello che succede è che la registrazione di una nuova IRegion è operazione deputata ad un Region Manager che necessita anche di un riferimento alla View che contiene la region.
L’inghippo è che se il tutto sta in un Popup il giochetto non funziona perchè il Logical Tree e il Visual Tree all’interno di un controllo Popup hanno un comportamento diverso essendo il Popup a tutti gli effetti una Window diversa.
Andando a spulciare scopro che Prism v2 in realtà questa cosa la fa… buffaldino :-) ma anche sacripante perchè la fa in maniera un po’ poco standard, aggiungendo cioè un attached behavior al controllo che volete “decorare” con il Popup, in questo modo il Popup nello xaml non esiste e tutto il motore di generazione delle region funziona come ci aspettiamo.
Ho quindi iniziato a lavorare per aggiungere questa chicca anche al mio toolkit perchè la necessità è quella di avere una ricerca contestuale, in un Popup simile a quello di un ComboBox, ma con la possibilità di inettare la UI di ricerca a runtime.
A breve qualche screen-shot o il dettaglio del fallimento :-)
.m

Wpf: “Drag & Drop” Behavior, embrionale.

Se soffrite da dipendenza acuta da M-V-VM questa è una discreta rottura perchè il drag & drop è “roba” totalmente da Presentation (aka View) ma la logica è totalmente da Business (aka ViewModel).
La gestione del drag & drop è quindi un ottimo candidato per divertirci con gli attached behavior, nome figoso per le ormai legacy attached properties.
Quello che vogliamo ottenere è questo:
<ListView HorizontalAlignment="Stretch" 
          SelectedItem="{Binding Path=Selection}"
          behaviors:DragDropManager.DataObject="{Binding Path=Selection}"
          behaviors:DragDropManager.DataObjectType="mySampleType"
          ItemsSource="{Binding Path=TestList}">
ergo poter definire, data ad esempio una ListView, ma funziona su qualsiasi UIElement, quale sia il dato (utilizzando il potentissimo strumento di Binding) da “draggare” e quale sia, opzionale, il DataFormat del “dragged object”.
E sul drop target limitarci a fare:
<Border Grid.Column="1" Margin="10"
                behaviors:DragDropManager.OnDropCommand="{Binding DropCommand}"
                HorizontalAlignment="Stretch"
                AllowDrop="True"
                VerticalAlignment="Stretch" Background="Gainsboro" />
Utilizzando un ICommand come “target” del drop. Utilizziamo un ICommand perchè si sposa molto bene con il concetto di “drop”, il drop è fondamentalmente fatto da 2 fasi:
  • una fase di analisi, durante di DragOver, per capire se la “roba” che stiamo draggando possa essere droppata sul target –> ICommand.CanExecute( DragOverArgs e );
  • una fase in cui effettivamente, se il DragOver ha dato feedback positivo, i dati vengono droppati –> ICommand.Execute( DropArgs e );
Il nostro codice nel VM si potrebbe quindi limitare ad una cosa di questo tipo:
this.DropCommand = DelegateCommand.Create()
    .OnCanExecute( o =>
    {
        var e = ( DragOverArgs )o;
        return e.Data.GetDataPresent( "mySampleType" );
    } )
    .OnExecute( o => 
    {
        var e = ( DropArgs )o;
        var data = e.Data.GetData( "mySampleType" );
        //Use "data"...
    } );
L’attached behavior DragDropManager si occupa di tutte le fasi essenziali della gestione del Drag & Drop e per ora lo fa in maniera decisamente minimale, ma lo fa.
Quello che viene fatto è decisamente semplice (fonti: D&D #1 e D&D #2):
  • Sull’elemento sorgente (aka DragSource):
    • vengono agganciati i 2 eventi fondamentali: PreviewMouseMove e PreviewMouseLeftButtonDown, non stiamo prendendo in considerazione l’eventualità che i pulsanti del mouse siano invertiti, in cui gestiamo l’inizio dell’operazione di D&D;
  • Sull’elemento destinazione (aka DropTarget):
    • Settiamo a true la proprietà AllowDrop;
    • Agganciamo gli eventi DragOver e Drop, nel primo recuperiamo una reference al command e invochiamo CanExecute, mentre nel secondo invochiamo Execute;
Partendo dal codice di Jaime non è difficile pssare ad una attached property/behavior, sopratutto se ci accontentiamo di una gestione minimale del D&D senza quindi icone custom o adorner layer che fanno cose mirabolanti.
.m

Monday, September 28, 2009

Ma pecccccchhhhèèèè :-)

Discreta rottura di mar*ni:
var wrapper = new Wrapper<Person>();
var a = TypeDescriptor.GetProperties( wrapper );
var b = TypeDescriptor.GetProperties( typeof( Wrapper<Person>) );
producono 2 risultati decisamente diversi… Gestibile, sia chiaro, ma decisamente una rottura che per ora rende inutilizzabile in molti scenari questa fantastica idea, autocelebration-mode-off :-)
peccatissimo, peccato…
.m

Sunday, September 27, 2009

UI Composition :: “Navigation”

Questa cosa è rimasta in sospeso da tempo immemore ed è ora di dare un senso, perchè altrimenti un senso non ce l’ha… :-)
La nostra applicazione funziona! ma effettivamente è poco più di un “Hello World”, però funziona. Prometto che diventerà qualcosa di più di un semplicissimo “proof of concept”.
Adesso però abbiamo un problema non da poco, ne abbiamo già parlato, e adesso cerchiamo di approfondire e nel limite del possibile dare una soluzione.
image
A volte si dice che un’immagine vale più di mille parole ma in questo caso non è proprio vero… non è che si capisca molto :-)
La necessità è quella al “doppio click” di visualizzare una Window con il dettaglio dell’item selezionato, abbiamo in questo caso 2 possibili problemi/necessità:
  • Facciamo doppio click su un elemento:
    • se c’è già aperta una window che visualizza quello specifico elemento dobbiamo portarla in foreground;
    • altrimenti dobbiamo aprirne una nuova;
  • Il secondo problema, già risolto con le “dynamic region”, è quello di poter sapere quale coppia view/region manager è stata aperta per poter iniettare i contenuti giusti nella Window giusta;
Il secondo problema è acqua passata. Possiamo occuparci del primo scoglio. In realtà il problema non è nulla di trascendentale e la soluzione è abbastanza semplice, Visual Studio docet.
n.d.r.
Per chi non lo sapesse Visual Studio, sin dalla primissima versione, è un’applicazione completamente basata su UI Composition e su IoC (Package/Services e IServiceProvider).
Running Documents Service
Abbiamo detto:
…se c’è già aperta una window che visualizza quello specifico elemento dobbiamo portarla in foreground…
Il problema vero sta tutto in quella frase e nelle due parole sottolineate, il nostro sistema di comunicazione interno, basato su messaggistica, è gestito dai ViewModel e dal Modulo stesso, nessuno di questi due attori sa nulla, e così è giusto che sia, di Window che visualizzano qualcosa. Quello che sappiamo al massimo è che ci potrebbe essere in esecuzione un ViewModel che ha come DataSource un determinato elemento ma anche una projection di quell’elemento...
Ecco che nasce l’esigenza di avere qualcuno che sia in grado di:
  1. Tenere traccia dei ViewModel/View aperti;
  2. Sapere se un certo ViewModel/View visualizza una certa cosa;
  3. Recuperare, nell’eventualità, un certo ViewModel/View;
Triviale direi:
public interface IRunningDocumentsService
{
    void RegisterDocument( IDocument document );
    void UnregisterDocument( IDocument document );
    Boolean IsRegistered( IDocument document );
    IEnumerable Find( FuncBoolean> criteria ) where T : IDocument;
    Boolean TryGetDocument( out T document ) where T : IDocument;
}
Dove IDocument è semplicemente questo:
public interface IDocument
{
    String Title { get; }
}
Oppure questo:
public interface IDataDocument : IDocument
{
    event EventHandler DirtyStateChanged;
    Boolean IsDirty { get; }
Boolean CanSave { get; } void Save();
    Boolean CanUndo { get; }
    void Undo();
void RejectChanges();
Boolean CanRedo { get; } void Redo(); }
Quindi qualcosa di un po’ esaustivo per le nostre necessità.
Il segreto di pulcinella per automatizzare le cose è far si che la registrazione avvenga automaticamente, per arrivare a ciò è sufficiente che il ViewModel di base da cui ereditate tutto il vostro mondo abbia una dipendenza dal servizio e se l’istanza è IDocument procede con la registrazione/deregistrazione.
Aggiungo un’ultima considerazione, negli esempi e nei post fino ad ora ho parlato di finestre, intendendo proprio finestre separate ma questo non è un vincolo, il mio toolkit, come anche Prism (forse sarebbe meglio metterli in ordine inverso :-)), utilizzano il concetto di finestra in maniera più ampia parlando semplicemente di View. Io tendo a parlare di finestre per il semplice fatto che è più semplice comunicare concetti, probabilmente complessi, utilizzando esempi semplici. Quindi che la nostra UI sia Outlook based, che per inciso a me piace molto, quindi MainWindow+ChildWindows(s) o Visual Studio based, quindi MainWindow+Documents, non c’è differenza.
.m

Saturday, September 26, 2009

xe.net: son soddisfazioni!

Volevo semplicemente ringraziare tutti quelli che hanno preso parte al meeting, organizzato da Xe.Net, che si è tenuto ieri sera a Mestre. Resto sempre basito di fronte a quello che lo spirito di community è in grado di fare, ieri c’erano 4 persone che hanno fatto una quantità industriale di km per venire a sentire 2 pazzi che sparlavano di Wpf, ben più di quelli che ho fatto io (circa 300 a tratta i miei…). Grazie.
Come al solito è stata un’esperienza illuminante. Grazie.
Ne approfitto anche per fare i complimenti al mio compagno di avventura.
.m

Friday, September 25, 2009

Stasera: Pattern Track Conference

Stasera Pattern Track Conference di XeDotNet, credo per la felicità di tutti la mia sessione sarà “slideless” solo codice.
Ci si vede li? Non vi tedio oltre perchè il mio compagno di avventura ha già dato tutti i dettagli del caso.
.m

Wednesday, September 23, 2009

IUserType, PK e join multiple

L’allergia continua ed evidentemente peggiora… :-)
Qualche tempo fa ho parlato di NHibernate e degli IUserType, fortunatamente non ho fatto vedere l’implementazione :-) perchè c’è un leggero bug, moltgo subdolo, ma sempre bug!
Un doveroso grazie a Marco De Sanctis che mi ha supportato nella ricerca/soluzione del problema.
Un minimo di storia, concedetemelo, immaginiamo un modello del tipo:
 image
dove avete una classe e delle associazioni, nell’esempio volutamente monodirezionali, non delle collection-association, che hanno la caratteristica di poter essere null. Avete quindi un Prodotto che può avere una Serie e può avere un Formato, ma non è detto che siano valorizzati.
Adesso volete semplicemente fare questo:
using( ISession session = SessionHelper.SessionFactory.OpenSession() )
{
    ICriteria c = session.CreateCriteria<Product>()
        .CreateAlias( "Format", "f", JoinType.LeftOuterJoin )
        .CreateAlias( "Series", "s", JoinType.LeftOuterJoin );

    var res = c.List<Product>();

    var wf = res.Where( p => p.Format == null ).ToArray();
    var ws = res.Where( p => p.Series == null ).ToArray();
}
Ergo avere in blocco uno o più prodotti con precaricate le associazioni, ove esistenti. Finchè le cose sono semplici, esattamente come nel modello di cui sopra, tutto funziona come ci si aspetta.
Ma se aggiungiamo una paio di “ficiur” al nostro dominio ecco che il tutto fa le bizze… per riprodurre il problema è sufficiente aggiungere:
  • Il supporto per il Versioning, io utilizzo i timestamp di Sql Server ma poco importa la scelta tennologica ;
  • i miei custom user type per gestire le primary key;
La cosa estremamente fuorviante è che l’errore l’avete sulla conversione da BinaryBlob verso il Byte[] per la gestione della version, perchè giustamente NH si lamenta perchè state cercando di convertire un DbNull in Byte[]… ma la domanda vera è perchè questo tentativo di conversione?
La query prodotta da NH è una cosa del tipo:
SELECT this_.Id          as Id0_2_,
       this_.Description as Descript2_0_2_,
       this_.Format_id   as Format3_0_2_,
       this_.Series_id   as Series4_0_2_,
       f1_.Id            as Id1_0_,
       f1_.Description   as Descript2_1_0_,
       s2_.Id            as Id2_1_,
       s2_.Description   as Descript2_2_1_
FROM   [Product] this_
       left outer join [Format] f1_
         on this_.Format_id = f1_.Id
       left outer join [Series] s2_
         on this_.Series_id = s2_.Id

Che giustamente nel caso di Prodotti senza Serie e/o senza Formato produce delle righe nel resultset che non contengono valori:
image
Guardando il resultset e confrontandolo con quello dell’esempio funzionante non ci sono sostanziali differenze se non i dati in più per fillare le parti nuove del dominio (Version e PK) mi concentro quindi sull’errore e dopo un po’ di verifiche del mapping sentenzio che il problema non sta li… e faccio una prova banale… commento la parte di mapping relativa alla gestione della Version… e tutto funziona senza errori :-)
Ma non è tutto oro quel che luccica, infatti non ci sono errori ma il risultato non è lo stesso quello atteso, NHibernate fa una cosa stranissima, all’apparenza, crea cioè proxy per tutte le reference anche dove dovrebbe metterci dei valori null, questi proxy hanno l’unica stranezza di avere tutte le proprietà a null… sempre più strano.
Alla fine debuggando un po’ qua e un po’ la e confrontando il risultato con il progetto funzionante scopro l’inghippo…
NHibernate fa un ragionamento all’apparenza strano, almeno per me che non ho studiato :-), si aspetta di avere un valore ben preciso per la PK di una entità che non esiste: null, mentre io gli davo un valore predefinito che nel mio dominio significava “null/empty” ma che naturalmente non era null, quello che succede quindi è che NHibernate “va” dallo IUserType e chiama NullSafeGet e siccome lo IUserType gli ritorna qualcosa di diverso da null NHibernate interpreta questo come: li c’è una entità da idratare… e fallisce!
Morale della favola: il manuale delle istruzioni se l’hanno inventato a qualcosa servirà pure… :-) altrimenti si rischia sempre di dare la colpa agli altri.
.m

La sindrome del coltellino svizzero

Separation Of Concern e Single Point of Responsibility (non ho trovato in link che mi piacesse) visti dalla parte sbagliata:
image
Quel coso fa troppe cose :-)
.m

Monday, September 21, 2009

Qualità della vita.

io sono decisamente deluso, il mio concetto di qualità della vita è distante anni luce dalla vita che sto vivendo ed è evidente che così non si può andare avanti.
  • 5.15 – Sveglia;
    • 10’ per gustare il caffè e cercare di capire in che mondo sono;
  • 5.25 – 5.45 – veloce lettura di posta, newsgroup e feed arretrati a cui faccio sempre più fatica a star dietro;
  • 5.45 – 8.00 – Una solution a caso su Visual Studio;
    • intermezzo… 6.15: si alza Beatrice che è destinata ad una simpatica giornata che inizia su uno dei tanti treni dei pendolari (aka carri bestiame), per me ormai sono eroi, credo che le condizioni siano paragonabili a quelle dei viaggi verso i lager nazisti;
  • 8.00 – Colazione, ormai troppo rapida, doccia e partenza per il cliente;
  • 9.00 – 18.00 - soddisfare le paturnie del cliente, che tipicamente vuole tutto per ieri e lo vuole pure gratis…
    • Intermezzo… pausa pranzo: Sempre una solution a caso su Visual Studio;
  • 18.00 – … – quando le forze me lo consentono, ormai sono in piedi da ben più di 12h provo ad andare in palestra, altrimenti mi dedico ad una nuova attività: una solution a caso su Visual Studio;
  • un momento a caso durante la serata – comincio a sbadigliare e crollo, poco importa dove…
Il tutto per che cosa? per ora vedo un solo motivo, che di certo non è un buon motivo: dare, nell’insieme, ben più del 50% (ma decisamente di più) di quello che porto a casa e quell’accozzaglia di parassati (se trovate un termine peggiore sappiate che lo condivido pienamente) che sono da sempre quelli che dovrebbero governarci.
A casa mia questa non si può considerare una vita di qualità, a dire il vero io non la considero neanche vita.
Questo post è stato scritto intanto che il fido Visual Studio compila una solution a caso… si potrebbe discutere per ore, ma non mi interessa farlo ergo i commenti sono chiusi.
.m

Saturday, September 12, 2009

Filicudi, Isole Eolie (ME)

Sono appena tornato da un posto semplicemente fantastico: Filicudi, Isole Eolie.
Lo spettacolo che ci si presentava tutte le mattine dalla terrazza della fantastica camera n° 9 parla da solo:
IMG_0351 IMG_1675 IMG_1674
La famiglia che cura la gestione dell’Hotel La Canna fa un lavoro ottimo per coccolare, soprattutto dal punto di vista culinario, i propri ospiti e ci riesce decisamente bene.
Per il resto posso solo aggiungere che la vacanza in un posto del genere è all’insegna del completo e solo relax, per capirci il cellulare sull’isola (molto piccola, circa 200 abitanti) non prende ovunque.
La consiglio a tutti, tranne probabilmente a chi ha bambini perchè l’inghippo è che non esistono le spiagge nel senso ludico/fanciullesco del termine:
IMG_1735 IMG_1636
Dimenticavo… anche gli alberi non è che siano poi così frequenti… quindi il sole picchia, minch*a se picchia :-)
Logistic Update
Faccio seguito al commento di Davide per aggiungere un po’ di informazioni logistiche per i naviganti.
Il sistema più semplice per arrivare alle Eolie forse è areo fino a Palermo e aliscafo con Ustica-lines Palermo-Eolie (circa 3h di navigazione)… ma… se, come la mia dolce metà, siete decisamente allergeci ai luoghi chiusi l’aliscafo è tutto tranne che l’ideale… quindi forse la soluzione migliore è:
Aliscafo (o traghetto se desiderate viaggiare con il vostro fido mezzo) da Milazzo, fino a Vulcano è poco meno di 1h di aliscafo. C’è un altro buonissimo motivo per cui è comunque meglio pianificare il viaggio da Milazzo: sia Utica-lines che Siremar sono tutto tranne che affidabili, in particolare in bassa stagione: ad esempio lunedì scorso è successo che un buffo di vento e onde di 50cm hanno causato l’isolamento completo delle Eolie per una intera giornata e una coppia di americani in albergo con noi si è dovuta smazzare il viaggio in elicottero (un po’ caro) per non perdere il volo intercontinentale. Questo perchè fanno un semplice ragionamento… tanto c’è un traghetto al giorno che soddisfa i bisogni primari anche se purtroppo per fare Filicudi-Milazzo ci mette circa 5h contro le 2 di alicafo… quindi meglio tener conto della cosa nella pianificazione.
A Filicudi mezzi di locomozione non servono, c’è una sola strada corta. Se non amate camminare l’ideale è noleggiare un motorino in loco. Ad Alicudi praticamente non esistono strade, quindi… In generale portarsi la macchina è totalmente inutile, potrebbe tornare comoda la moto ma attenzione che è impossibile spostarsi da un’isola all’altra in giornata con mezzi diversi dall’aliscafo. Una soluzione è la bicicletta.
Nota di redazione: i collegamenti tra le isole non sono pensati per un turismo giornaliero quindi ad esempio da Filicudi è impossibile andare in giornata a Stromboli e/o Panarea (e viceversa) ma è necessario fermarsi almeno una notte, quindi in base al tipo di vacanza che vi può interessare potrebbe essere interessante valutare di fare 3/4 giorni a Stromboli, 3/4 giorni a Filicudi, un paio di giorni a Vulcano. Noi siamo comunque riusciti a visitare Salina, Lipari e Vulcano.
Altra nota di redazione: la sensazione, data dalla tipologia di infrastrutture (in particolare a Lipari e a Vulcano) e dalla presenza massiccia di venditori di ogni genere, sorta e provenienza è che il turismo in alta stagione sia parecchio, con molti stranieri dell’est (semplice deduzione data dal fatto che l’ordine di apparizione delle informazioni a Vulcano è Russo, Italiano, Inglese). Siccome in generale io sono allergico al parecchio, a prescindere dalla provenienza, uomo avvisato mezzo salvato.
Filicudi e Alicudi escono decisamente da questa logica anche perchè per certi versi (in particolare naturalistici) sono tutto tranne che ospitali per il turista abituato alla riviera baldanzosa. A Filicudi il concetto di dopo cena semplicemente non esiste, malvasia con i biscotti e la pasta di mandorle in terrazza e ore 22 nanna. Ad Alicudi men che meno… :-) il mio posto!

.m

Xe.Net: il meeting, un’appuntamento una passione!

Anche quest’anno avrò l’onore di prendere parte ad uno dei meeting di Xe.Net, questa volta (tanto per cambiare) il tema sarà Wpf in salsa Model View ViewModel, la sessione sarà in code-sharing (come le compagnie aeree) con Davide Senatore, Davide si occuperà di una coprposa ed esaustiva introduzione al mondo Wpf in salsa M-V-VM con alcune digressioni su Wfp in quanto tecnologia di presentazione mentre io mi stavo chiedendo come impostare la mia parte della sessione…
Sessione tradizionale o Q&A/ simil OpenSpace?
In generale l’obiettivo che vorrei raggiungere è quello di approfondire molto, veramente molto, alcuni argomenti. Tutto è impossibile ma da qualche parte bisogna pur cominciare :-) le sessioni tradzionali hanno purtroppo, è il formato che lo impone, il limite di non poter approfondire come si deve e anche quando nel titolo c’è la frasetta magica “real world” spesso i problemi reali vengono solo scalfiti e marginalmente affrontati, ripeto non è una critica è una semplice constatazione derivante dall’evidenza a dalle “necessità di scena”, 75 minuti quando va bene sono veramente pochi.
Vorrei cercare di capire se questo limite è superabile scroccando/sfruttando il format delle sessioni Xe.net in cui una doppia sessione su un singolo argomento garantisce ben più di 2h di chiaccherata equamente divisa tra una corposa ed esaustiva introduzione e la possibilità di approfondire all’osso un paio di argomenti a scelta.
Che ne dite? se volete dire la vostra i commenti sono aperti.
Io sarei disposto ad approfondire ad esempio:
  • perchè e come usare IoC in un mondo M-V-VM e il suo difficile rapporto con le attached properties;
  • M-V-VM come layer di mascheramento totale: la conseguenza è Domiain Model anemico, molto anemico?
  • In realazione a quanto di cui sopra: wrappare costa un sacco! ne vale la pena? che soluzioni abbiamo?
  • La validazione dei dati dell’utente in M-V-VM: come sfruttare semplicemente VAB di enterprise library;
La sessione verterà comunque su questi argomenti, quello che vorrei capire è:
  • Avete altre cose di cui vorreste un approfondimento;
  • se preferire una sessione più interattiva dove voi fate le domande e mi massacrate :-)
Commentate gente, commentate :-)
.m