<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>WPF</title>
        <link>http://blogs.ugidotnet.org/martinobordin/category/WPF.aspx</link>
        <description>My adventures in the WPF world</description>
        <language>it</language>
        <copyright>Martino Bordin</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>Utilizzare l&amp;rsquo;interfaccia Metro su un&amp;rsquo;applicazione WPF</title>
            <link>http://blogs.ugidotnet.org/martinobordin/archive/2012/06/11/utilizzare-lrsquointerfaccia-metro-su-unrsquoapplicazione-wpf.aspx</link>
            <description>&lt;p&gt;Se negli ultimi anni non avete vissuto su Marte, avrete sicuramente sentito parlare dell’interfaccia Metro (per i marziani, ecco un &lt;a href="http://it.wikipedia.org/wiki/Metro_(interfaccia_grafica)"&gt;link&lt;/a&gt; che vi spiega velocemente cos’è &lt;img alt="" src="/Providers/BlogEntryEditor/FCKeditor/editor/images/smiley/msn/regular_smile.gif" /&gt; ).&lt;/p&gt;
&lt;p&gt;Nel caso stiate sviluppando applicazioni per Windows Phone o Windows 8 (le famose Metro App), avrete già tutti i controlli disponibili che seguono questo stile, senza dover adottare alcun accorgimento particolare..&lt;/p&gt;
&lt;p&gt;E nel caso di applicazioni WPF?&lt;/p&gt;
&lt;p&gt;Bhè, esiste il toolkit di &lt;a href="http://goo.gl/o2YBh"&gt;Mahapps&lt;/a&gt;, che ci omaggia di una serie di controlli, stili, behaviors e attached properties che fanno proprio al caso nostro!&lt;/p&gt;
&lt;p&gt;Come potete vedere il risultato è notevole, e senza particolari stravolgimenti del nostro Xaml:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://mahapps.com/MahApps.Metro/images/animatedtabcontrol.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Metro is everywhere! &lt;img class="wlEmoticon wlEmoticon-smile" style="" alt="Sorriso" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/martinobordin/Windows-Live-Writer/Interfaccia-Metro-su-unapplicazione-WPF_DD9E/wlEmoticon-smile_2.png" /&gt;&lt;/p&gt;
&lt;p&gt;P.S: Anche per il web sono disponibile progetti interessanti (es &lt;a href="http://naghsheh.info/Pivot/Pivot.htm"&gt;link1&lt;/a&gt; , &lt;a href="http://www.drewgreenwell.com/projects/metrojs"&gt;link2&lt;/a&gt;)&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/martinobordin/aggbug/101049.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martino Bordin</dc:creator>
            <guid>http://blogs.ugidotnet.org/martinobordin/archive/2012/06/11/utilizzare-lrsquointerfaccia-metro-su-unrsquoapplicazione-wpf.aspx</guid>
            <pubDate>Mon, 11 Jun 2012 17:00:55 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/martinobordin/archive/2012/06/11/utilizzare-lrsquointerfaccia-metro-su-unrsquoapplicazione-wpf.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/martinobordin/comments/commentRss/101049.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/martinobordin/services/trackbacks/101049.aspx</trackback:ping>
        </item>
        <item>
            <title>Merge di DLL in un&amp;rsquo;applicazione WPF</title>
            <link>http://blogs.ugidotnet.org/martinobordin/archive/2012/04/05/merge-di-dll-in-unrsquoapplicazione-wpf.aspx</link>
            <description>&lt;p&gt;Recentemente ho dovuto creare un’applicazione WPF che fosse facilmente distribuibile (leggi: distribuire solo l’exe). &lt;/p&gt;  &lt;p&gt;Purtroppo il tool &lt;a href="http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx"&gt;ILMerge&lt;/a&gt; non funziona per applicazioni WPF, a causa di problemi con le risorse contenute in esse (esistono comunque tool funzionanti di terze parti, a pagamento).&lt;/p&gt;  &lt;p&gt;Seguendo questo &lt;a href="http://www.digitallycreated.net/Blog/61/combining-multiple-assemblies-into-a-single-exe-for-a-wpf-application"&gt;post&lt;/a&gt;, ho creato un esempio che qui illustro e che potete scaricare &lt;a href="https://skydrive.live.com/redir.aspx?cid=bea2d3dac634f29c&amp;amp;resid=BEA2D3DAC634F29C!126&amp;amp;parid=BEA2D3DAC634F29C!123"&gt;qui&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;L’applicazione visualizza semplicemente il fullname di due classi presenti in 2 assembly referenziati:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/martinobordin/Windows-Live-Writer/65ebb30729a7_A52D/image_2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/martinobordin/Windows-Live-Writer/65ebb30729a7_A52D/image_thumb.png" width="466" height="415" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Per prima cosa è necessario modificare il file di progetto dell’applicazione WPF aggiungendo, dopo “Microsoft.CSharp.targets” , il seguente snippet:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:643c8b88-cddb-4c8e-b2d2-46039cb157f2" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Target&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;AfterResolveReferences&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;ItemGroup&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;EmbeddedResource&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Include&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;@(ReferenceCopyLocalPaths)&lt;/span&gt;"&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Condition&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;'%(ReferenceCopyLocalPaths.Extension)' == '.dll'&lt;/span&gt;"&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;LogicalName&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;%(ReferenceCopyLocalPaths.DestinationSubDirectory)%(ReferenceCopyLocalPaths.Filename)%(ReferenceCopyLocalPaths.Extension)&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;LogicalName&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;EmbeddedResource&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;ItemGroup&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Target&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Semplicemente, andiamo ad indicare di inserire tutti i file referenziati con estensione “.dll” come “emdedded resource” nell’exe principale. In questo modo eviteremo di eseguire a mano l’inclusione dell’ultima versione delle librerie compilate.&lt;/p&gt;  &lt;p&gt;Nelle proprietà del progetto, impostiamo il seguente comando da eseguire durante la fase di post-build: “del $(TargetDir)*.dll” per cancellare tutte le librerie presenti nella “bin”, che non ci serviranno più...&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/martinobordin/Windows-Live-Writer/65ebb30729a7_A52D/image_4.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/martinobordin/Windows-Live-Writer/65ebb30729a7_A52D/image_thumb_1.png" width="573" height="640" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Impostiamo quindi come oggetto di avvio la classe Bootstrapper (potete ovviamente cambiare il nome):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/martinobordin/Windows-Live-Writer/65ebb30729a7_A52D/image_6.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/martinobordin/Windows-Live-Writer/65ebb30729a7_A52D/image_thumb_2.png" width="640" height="621" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Questa, infine, è come definita la classe BootStrapper:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:de3e93d6-ea90-44ef-a3d9-bc504671100b" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;BootStrapper&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;{&lt;/li&gt; &lt;li&gt;    [&lt;span style="color:#2b91af"&gt;STAThread&lt;/span&gt;]&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000ff"&gt;string&lt;/span&gt;[] args)&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#2b91af"&gt;AppDomain&lt;/span&gt;.CurrentDomain.AssemblyResolve += OnResolveAssembly;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#2b91af"&gt;App&lt;/span&gt;.Main();&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    }&lt;/li&gt; &lt;li&gt; &lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Assembly&lt;/span&gt; OnResolveAssembly(&lt;span style="color:#0000ff"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af"&gt;ResolveEventArgs&lt;/span&gt; args)&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; executingAssembly = &lt;span style="color:#2b91af"&gt;Assembly&lt;/span&gt;.GetExecutingAssembly();&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; assemblyName = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;AssemblyName&lt;/span&gt;(args.Name);&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt; &lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; path = &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515"&gt;"{&lt;/span&gt;&lt;span style="color:#3cb371"&gt;0}&lt;/span&gt;&lt;span style="color:#a31515"&gt;.dll"&lt;/span&gt;, assemblyName.Name);&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (assemblyName.CultureInfo.Equals(&lt;span style="color:#2b91af"&gt;CultureInfo&lt;/span&gt;.InvariantCulture) == &lt;span style="color:#0000ff"&gt;false&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            path = &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515"&gt;@"{&lt;/span&gt;&lt;span style="color:#3cb371"&gt;0}\&lt;/span&gt;&lt;span style="color:#a31515"&gt;\cf4 {1}"&lt;/span&gt;, assemblyName.CultureInfo, path);&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt; &lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;using&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;var&lt;/span&gt; stream = executingAssembly.GetManifestResourceStream(path))&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (stream == &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            {&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            }&lt;/li&gt; &lt;li&gt; &lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; assemblyRawBytes = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff"&gt;byte&lt;/span&gt;[stream.Length];&lt;/li&gt; &lt;li&gt;            stream.Read(assemblyRawBytes, 0, assemblyRawBytes.Length);&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Assembly&lt;/span&gt;.Load(assemblyRawBytes);&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Sostanzialmente ci agganciamo all’evento AssemblyResolve dell’AppDomain corrente, che viene sollevato ogni volta che la risoluzione di un’assembly fallisce, e ritorniamo l’assembly che abbia in canna nelle embedded resources.&lt;/p&gt;  &lt;p&gt;Ecco infatti come si presenta il nostro exe “aprendolo” con &lt;a href="http://wiki.sharpdevelop.net/ILSpy.ashx"&gt;ILSpy&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/martinobordin/Windows-Live-Writer/65ebb30729a7_A52D/image_8.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/martinobordin/Windows-Live-Writer/65ebb30729a7_A52D/image_thumb_3.png" width="252" height="640" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;E’ anche più semplice di usare la riga di comando di ILMerge ! &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-openmouthedsmile" alt="A bocca aperta" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/martinobordin/Windows-Live-Writer/65ebb30729a7_A52D/wlEmoticon-openmouthedsmile_2.png" /&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/martinobordin/aggbug/100921.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martino Bordin</dc:creator>
            <guid>http://blogs.ugidotnet.org/martinobordin/archive/2012/04/05/merge-di-dll-in-unrsquoapplicazione-wpf.aspx</guid>
            <pubDate>Thu, 05 Apr 2012 15:07:51 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/martinobordin/archive/2012/04/05/merge-di-dll-in-unrsquoapplicazione-wpf.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/martinobordin/comments/commentRss/100921.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/martinobordin/services/trackbacks/100921.aspx</trackback:ping>
        </item>
        <item>
            <title>Listbox WPF: disabilitata ma non troppo!</title>
            <link>http://blogs.ugidotnet.org/martinobordin/archive/2012/04/03/listbox-wpf-disabilitata-ma-non-troppo.aspx</link>
            <description>&lt;p&gt;Recentemente ho dovuto realizzare una sorta di wizard in WPF, ovvero una classica window con un’intestazione, una listbox a sinistra che visualizza gli step (evidenziando lo step corrente) e un contentpresenter in cui verrà caricato il contenuto dinamicamente. Niente di complicato.&lt;/p&gt;
&lt;p&gt;La cosa “particolare” è il fatto che la listbox con l’elenco degli step è read-only, ovvero  deve solo presentare i dati e l’utente  non deve poter selezionare qual’è lo step corrente..altrimenti che procedura guidata è? &lt;img alt="" src="/Providers/BlogEntryEditor/FCKeditor/editor/images/smiley/msn/regular_smile.gif" /&gt;.&lt;/p&gt;
&lt;p&gt;Ovviamente è possibile disabilitare la listbox , ma in questo  modo lo stile applicato rende il tutto poco usabile e gradevole (un grigio che mina la leggibilità del controllo )..e di certo non mi andava di rifare il template del controllo per questa sciocchezza.&lt;/p&gt;
&lt;p&gt;Ho risolto semplicemente creando uno style per l’ItemContainer e impostando a &lt;strong&gt;false&lt;/strong&gt; la proprietà &lt;strong&gt;Focusable&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:3e9ef0f4-53ec-4f8b-8f3f-324a8a745db0" style="margin: 0px; padding: 0px; float: none; display: inline;"&gt;
&lt;div style="border: 1px solid rgb(0, 0, 128); color: rgb(0, 0, 0); font-family: &amp;quot;Courier New&amp;quot;, Courier, Monospace; font-size: 10pt;"&gt;
&lt;div style="background: rgb(221, 221, 221); overflow: auto;"&gt;
&lt;ol style="background: rgb(255, 255, 255); margin: 0px 0px 0px 2.5em; padding: 0px 0px 0px 5px; white-space: nowrap;" start="1"&gt;
    &lt;li&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;ListBox.ItemContainerStyle&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;                &lt;span style="color: rgb(163, 21, 21);"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;Style&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt; TargetType&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="{&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;x&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;Type&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt; ListBoxItem}&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;                    &lt;span style="color: rgb(163, 21, 21);"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;Setter&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt; Property&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="Focusable"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt; Value&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="False"/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;                    &lt;span style="color: rgb(163, 21, 21);"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;                        &lt;span style="color: rgb(163, 21, 21);"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;Trigger&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt; Property&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="IsSelected"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt; Value&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="True"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;                            &lt;span style="color: rgb(163, 21, 21);"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;Setter&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt; Property&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="FontWeight"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt; Value&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="Bold" /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;                        &lt;span style="color: rgb(163, 21, 21);"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;Trigger&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;                    &lt;span style="color: rgb(163, 21, 21);"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;                &lt;span style="color: rgb(163, 21, 21);"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;Style&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;            &lt;span style="color: rgb(163, 21, 21);"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;ListBox.ItemContainerStyle&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Thanks WPF!&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/martinobordin/aggbug/100915.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martino Bordin</dc:creator>
            <guid>http://blogs.ugidotnet.org/martinobordin/archive/2012/04/03/listbox-wpf-disabilitata-ma-non-troppo.aspx</guid>
            <pubDate>Tue, 03 Apr 2012 14:55:30 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/martinobordin/archive/2012/04/03/listbox-wpf-disabilitata-ma-non-troppo.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/martinobordin/comments/commentRss/100915.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/martinobordin/services/trackbacks/100915.aspx</trackback:ping>
        </item>
        <item>
            <title>Automapper : creare Dto da proxy Nhibernate</title>
            <link>http://blogs.ugidotnet.org/martinobordin/archive/2012/02/29/automapper-creare-dto-da-proxy-nhibernate.aspx</link>
            <description>&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/martinobordin/Windows-Live-Writer/283456f95145_81DC/automapper_2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px; padding-top: 0px" title="automapper" border="0" alt="automapper" align="right" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/martinobordin/Windows-Live-Writer/283456f95145_81DC/automapper_thumb.png" width="260" height="44" /&gt;&lt;/a&gt;Se utilizzate &lt;a href="https://github.com/AutoMapper/AutoMapper"&gt;AutoMapper&lt;/a&gt; per creare &lt;a href="http://en.wikipedia.org/wiki/Data_Transfer_Object"&gt;Dto&lt;/a&gt; da oggetti letti con &lt;a href="http://nhforge.org/Default.aspx"&gt;Nhibernate&lt;/a&gt; e &lt;a href="http://en.wikipedia.org/wiki/Lazy_loading"&gt;lazy-loading&lt;/a&gt; attivo, è possibile che otteniate un’eccezione di tipo &lt;strong&gt;ObjectDisposedException&lt;/strong&gt;, in quanto Automapper accede a proprietà “Lazy”, ma la sessione è già stata chiusa e distrutta.&lt;/p&gt;  &lt;p&gt;Per risolverlo, basta implementare un &lt;a href="https://github.com/AutoMapper/AutoMapper/wiki/Custom-value-resolvers"&gt;Custom Resolver&lt;/a&gt;, che tornerà n&lt;em&gt;ull&lt;/em&gt; qualora il tipo della proprietà che sto provando a mappare sia un proxy non inizializzato.&lt;/p&gt;  &lt;p&gt;Ecco quindi il codice:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a00656a8-65a4-4d40-b29a-2ecf46ddf3e6" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;NhProxyResolver&lt;/span&gt; : ValueResolver&amp;lt;&lt;span style="color:#0000ff"&gt;object&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;object&lt;/span&gt;&amp;gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff"&gt;object&lt;/span&gt; ResolveCore(&lt;span style="color:#0000ff"&gt;object&lt;/span&gt; source)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; NHibernateUtil.IsInitialized(source) ? source : &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;ed un esempio della configurazione di AutoMapper:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:4d2a3829-ecc1-4830-80e2-d3571fbdb8a2" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;Mapper.CreateMap&amp;lt;User, UserDto&amp;gt;()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    .ForMember(x =&amp;gt; x.Orders, opt =&amp;gt; opt.ResolveUsing&amp;lt;NhProxyResolver&amp;gt;().FromMember(z =&amp;gt; z.Orders));&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/martinobordin/aggbug/100686.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martino Bordin</dc:creator>
            <guid>http://blogs.ugidotnet.org/martinobordin/archive/2012/02/29/automapper-creare-dto-da-proxy-nhibernate.aspx</guid>
            <pubDate>Wed, 29 Feb 2012 01:00:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/martinobordin/archive/2012/02/29/automapper-creare-dto-da-proxy-nhibernate.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/martinobordin/comments/commentRss/100686.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/martinobordin/services/trackbacks/100686.aspx</trackback:ping>
        </item>
        <item>
            <title>Automapper : da Dto a ViewModel</title>
            <link>http://blogs.ugidotnet.org/martinobordin/archive/2011/12/03/automapper-da-dto-a-mvvm.aspx</link>
            <description>&lt;p&gt;Ultimamente, in una applicazione WPF, sto utilizzando pesantemente &lt;a href="http://automapper.org/"&gt;Automapper&lt;/a&gt; per convertire dei &lt;a href="http://martinfowler.com/eaaCatalog/dataTransferObject.html"&gt;DTO&lt;/a&gt;, ritornati da un servizio , in &lt;a href="http://msdn.microsoft.com/en-us/magazine/dd419663.aspx"&gt;ViewModel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Per chi non lo conoscesse questa libreria permette di mappare, in base a convenzioni, un oggetto in un altro .&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/martinobordin/Windows-Live-Writer/c474419cfc17_1374E/automapper_8.png"&gt;&lt;img border="0" align="right" width="260" height="44" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/martinobordin/Windows-Live-Writer/c474419cfc17_1374E/automapper_thumb_2.png" alt="automapper" title="automapper" style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Detto cosi sembra banale e quasi inutile, in realtà se leggete la documentazione e fate qualche test capirete che offre un sacco di funzionalità e vi tornerà utile in moltissimi casi, tra cui quello che da il titolo a questo post.&lt;/p&gt;
&lt;p&gt;Inoltre, essendo estramemente versatile, possiamo anche creare regole custom per mappare gli oggetti o definire eccezioni in questo modo:&lt;/p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:bbfcf61d-b51d-4b2b-bf59-53639f1352b3" style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px"&gt;
&lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt;
&lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt;
&lt;ol style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px;"&gt;
    &lt;li&gt;&lt;span style="color:#2b91af"&gt;Mapper&lt;/span&gt;.CreateMap&amp;lt;&lt;span style="color:#2b91af"&gt;PersonDto&lt;/span&gt;, &lt;span style="color:#2b91af"&gt;PersonViewModel&lt;/span&gt;&amp;gt;()&lt;/li&gt;
    &lt;li style="background: #f3f3f3"&gt;    .ForMember(x =&amp;gt; x.HasError, opt =&amp;gt; opt.Ignore());&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Per facilitarmi il lavoro quotidiano, ho scritto un’extension method che indica ad Automapper di ignorare tutte le proprietà di tipo ICommand, in maniera tale da non sollevare eccezioni in fase di verifica delle mappature (operazione effettuata con il metodo &lt;strong&gt;Mapper.AssertConfigurationIsValid()).&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ecco quindi il codice, abbastanza intuitivo:&lt;/p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:4956072c-528f-4306-8321-fcd9aea51ec0" style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px"&gt;
&lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt;
&lt;div style="background: #ddd; overflow: auto"&gt;
&lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt;
    &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;AutoMapperExtensions&lt;/span&gt;&lt;/li&gt;
    &lt;li style="background: #f3f3f3"&gt;{&lt;/li&gt;
    &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IMappingExpression&lt;/span&gt;&amp;lt;TSource, TDestination&amp;gt; IgnoreAllICommand&amp;lt;TSource, TDestination&amp;gt;(&lt;span style="color:#0000ff"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IMappingExpression&lt;/span&gt;&amp;lt;TSource, TDestination&amp;gt; expression)&lt;/li&gt;
    &lt;li style="background: #f3f3f3"&gt;    {&lt;/li&gt;
    &lt;li&gt;        &lt;span style="color:#0000ff"&gt;const&lt;/span&gt; &lt;span style="color:#2b91af"&gt;BindingFlags&lt;/span&gt; PublicInstanceFlags = &lt;span style="color:#2b91af"&gt;BindingFlags&lt;/span&gt;.Public | &lt;span style="color:#2b91af"&gt;BindingFlags&lt;/span&gt;.Instance;&lt;/li&gt;
    &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; destinationProperties = &lt;span style="color:#0000ff"&gt;typeof&lt;/span&gt;(TDestination).GetProperties(PublicInstanceFlags);&lt;/li&gt;
    &lt;li&gt; &lt;/li&gt;
    &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;foreach&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;var&lt;/span&gt; property &lt;span style="color:#0000ff"&gt;in&lt;/span&gt; destinationProperties)&lt;/li&gt;
    &lt;li&gt;        {&lt;/li&gt;
    &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (property.PropertyType == &lt;span style="color:#0000ff"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;ICommand&lt;/span&gt;))&lt;/li&gt;
    &lt;li&gt;            {&lt;/li&gt;
    &lt;li style="background: #f3f3f3"&gt;                expression.ForMember(property.Name, opt =&amp;gt; opt.Ignore());&lt;/li&gt;
    &lt;li&gt;            }&lt;/li&gt;
    &lt;li style="background: #f3f3f3"&gt;        }&lt;/li&gt;
    &lt;li&gt; &lt;/li&gt;
    &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; expression;&lt;/li&gt;
    &lt;li&gt;    }&lt;/li&gt;
    &lt;li style="background: #f3f3f3"&gt;}&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Per utilizzarlo invece:&lt;/p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:68618f31-131f-4619-8589-357db8ea115c" style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px"&gt;
&lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt;
&lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt;
&lt;ol style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px;"&gt;
    &lt;li&gt;&lt;span style="color:#2b91af"&gt;Mapper&lt;/span&gt;.CreateMap&amp;lt;&lt;span style="color:#2b91af"&gt;PersonDto&lt;/span&gt;, &lt;span style="color:#2b91af"&gt;PersonViewModel&lt;/span&gt;&amp;gt;()&lt;/li&gt;
    &lt;li style="background: #f3f3f3"&gt;    .IgnoreAllICommand()&lt;/li&gt;
    &lt;li&gt;    .ForMember(x =&amp;gt; x.HasError, opt =&amp;gt; opt.Ignore());&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;In questo modo non devo “dire” ad AutoMapper di ignorare i vari Command dei ViewModel singolarmente &lt;img src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/martinobordin/Windows-Live-Writer/c474419cfc17_1374E/wlEmoticon-winkingsmile_2.png" alt="Occhiolino" class="wlEmoticon wlEmoticon-winkingsmile" style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" /&gt;.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/martinobordin/aggbug/100597.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martino Bordin</dc:creator>
            <guid>http://blogs.ugidotnet.org/martinobordin/archive/2011/12/03/automapper-da-dto-a-mvvm.aspx</guid>
            <pubDate>Sat, 03 Dec 2011 14:59:29 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/martinobordin/archive/2011/12/03/automapper-da-dto-a-mvvm.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/martinobordin/comments/commentRss/100597.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/martinobordin/services/trackbacks/100597.aspx</trackback:ping>
        </item>
        <item>
            <title>Blendability con Moq e NBuilder</title>
            <link>http://blogs.ugidotnet.org/martinobordin/archive/2011/08/09/blendability-con-moq-e-nbuilder.aspx</link>
            <description>&lt;p&gt;Che il vostro progetto sia sviluppato in WPF, Silverlight o Silverlight per WP7 un aspetto fondamentale (direi quasi un requisito non funzionale) da soddisfare è il supporto ai designer di Visual Studio/Blend, identificato con il termine “&lt;strong&gt;Blendability&lt;/strong&gt;”.&lt;/p&gt;  &lt;p&gt;Anche se può sembrare banale, in realtà la faccenda si complica man mano che i nostri ViewModel prendono forma e utilizziamo &lt;a href="http://en.wikipedia.org/wiki/Inversion_of_control"&gt;IoC&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;In soldoni il Designer non è in grado di rappresentare graficamente una View collegata ad un ViewModel di questo tipo:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:44420792-6ca1-4224-80c3-b852409584a9" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; MainViewModel(&lt;span style="color:#2b91af"&gt;IPersonService&lt;/span&gt; personService)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;{&lt;/li&gt; &lt;li&gt;    People = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ObservableCollection&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;Person&lt;/span&gt;&amp;gt;(personService.GetAll());&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt; &lt;/li&gt; &lt;li&gt;    ShowPersonDetailCommand = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;RelayCommand&lt;/span&gt;(PerformShowPersonDetail, CanShowPersonDetail);&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Tra le soluzioni possibili troviamo:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;utilizzare un ViewModelLocator che restituisce istanze diverse dei ViewModel se siamo a design-time o a run-time (es: &lt;a href="http://blog.roboblob.com/2010/01/17/wiring-up-view-and-viewmodel-in-mvvm-and-silverlight-4-blendability-included/"&gt;link&lt;/a&gt;) &lt;/li&gt;    &lt;li&gt;utilizzare ViewModel che si comportano in modo diverso se siamo a design-time o a run-time (es: &lt;a href="http://netindonesia.net/blogs/zeddy/archive/2011/06/23/wp7-intro-to-mvvm-amp-blendability-by-building-twitter-app-part-1.aspx"&gt;link&lt;/a&gt;) &lt;/li&gt;    &lt;li&gt;utilizzare file XAML in cui definire i dati fake (es: &lt;a href="http://karlshifflett.wordpress.com/2009/10/21/visual-studio-2010-beta2-sample-data-project-templates/"&gt;link&lt;/a&gt;) &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Personalmente, anche se funzionanti, non mi piace nessuna delle soluzioni proposte in quanto:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;vado ad inserire logica completamente estranea ai ViewModelLocator\ViewModel (punti 1, 2) &lt;/li&gt;    &lt;li&gt;mi ritrovo a manutenere file XAML satelliti che andranno ad appesantire il refactoring (punto 3) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Da un po' di tempo a questa parte sto adottando la strategia che da il titolo a questo post: uso &lt;a href="http://code.google.com/p/moq/"&gt;Moq&lt;/a&gt; e &lt;a href="http://nbuilder.org/"&gt;NBuilder&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Per chi non li conoscesse, sono 2 librerie che facilitano la scrittura di test automatici, essendo rispettivamente un framework di mocking e un tool per la generazione dinamica di oggetti. &lt;/p&gt;  &lt;p&gt;Nonostante siano strumenti nati per altri scopi, ho deciso di provarli per ottenere ViewModel “blendabili”.&lt;/p&gt;  &lt;p&gt;In pratica:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Vado a creare, possibilmente in un assembly a parte, un &lt;strong&gt;MainViewModelDesign  &lt;/strong&gt;che eredita dal &lt;strong&gt;MainViewModel&lt;/strong&gt; visto in precedenza. &lt;/li&gt; &lt;/ul&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:b566f2aa-c066-4b13-b9bb-97c7530acb5e" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;MainViewModelDesign&lt;/span&gt; : &lt;span style="color:#2b91af"&gt;MainViewModel&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; MainViewModelDesign()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        : &lt;span style="color:#0000ff"&gt;base&lt;/span&gt;(&lt;span style="color:#ff0000"&gt;GetMockedService&lt;/span&gt;())&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;ul&gt;   &lt;li&gt;Il Metodo &lt;strong&gt;GetMockedService&lt;/strong&gt; mi ritorna un &lt;strong&gt;mock&lt;/strong&gt; che implementa IPersonService e va a definire i metodi utilizzati dal ViewModel in questione. In questo caso ho instrumentato &lt;strong&gt;Moq&lt;/strong&gt; in maniera tale che, quando viene invocato il metodo &lt;strong&gt;GetAll&lt;/strong&gt;, mi restituisca, tramite la classe Builder di &lt;strong&gt;NBuilder&lt;/strong&gt;, un elenco di &lt;strong&gt;Person&lt;/strong&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8c424d18-3eea-4015-bda3-f35129399cb7" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IPersonService&lt;/span&gt; GetMockedService()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; mockedService = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Mock&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;IPersonService&lt;/span&gt;&amp;gt;();&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    mockedService&lt;/li&gt; &lt;li&gt;        .Setup(s =&amp;gt; s.GetAll())&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        .Returns(&lt;span style="color:#2b91af"&gt;Builder&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;Person&lt;/span&gt;&amp;gt;.CreateListOfSize(5).Build());&lt;/li&gt; &lt;li&gt; &lt;/li&gt; &lt;li style="background: #f3f3f3"&gt; &lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; mockedService.Object;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;ul&gt;   &lt;li&gt;Per collegare il nostro nuovo ViewModel useremo il Databinding e la proprietà d: DataContext, utilizzando la markup extension&lt;strong&gt; {d: DesignInstance}&lt;/strong&gt; (maggiori info &lt;a href="http://msdn.microsoft.com/en-us/library/dd490796%28VS.100%29.aspx"&gt;qui&lt;/a&gt;),  passando il nome del ViewModel che vogliamo venga creato automaticamente dal designer  (riga 12): &lt;/li&gt; &lt;/ul&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8df8a9e7-f234-43e9-96c1-acba2f7d9ee6" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Window&lt;/span&gt; &lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#ff0000"&gt;x&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000"&gt;Class&lt;/span&gt;&lt;span style="color:#0000ff"&gt;="Blendability.Views.MainWindow"&lt;/span&gt;&lt;/li&gt; &lt;li&gt;   &lt;span style="color:#ff0000"&gt; xmlns&lt;/span&gt;&lt;span style="color:#0000ff"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;   &lt;span style="color:#ff0000"&gt; xmlns&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000"&gt;x&lt;/span&gt;&lt;span style="color:#0000ff"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#ff0000"&gt;xmlns&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000"&gt;d&lt;/span&gt;&lt;span style="color:#0000ff"&gt;="http://schemas.microsoft.com/expression/blend/2008"&lt;/span&gt; &lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#ff0000"&gt;xmlns&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000"&gt;mc&lt;/span&gt;&lt;span style="color:#0000ff"&gt;="http://schemas.openxmlformats.org/markup-compatibility/2006"&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#ff0000"&gt;xmlns&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000"&gt;viewModels&lt;/span&gt;&lt;span style="color:#0000ff"&gt;="clr-namespace:Blendability.ViewModels.Design"&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;   &lt;span style="color:#ff0000"&gt; Title&lt;/span&gt;&lt;span style="color:#0000ff"&gt;="People"&lt;/span&gt; &lt;/li&gt; &lt;li&gt;    &lt;span style="color:#ff0000"&gt;Height&lt;/span&gt;&lt;span style="color:#0000ff"&gt;="350"&lt;/span&gt; &lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#ff0000"&gt;Width&lt;/span&gt;&lt;span style="color:#0000ff"&gt;="525"&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#ff0000"&gt;mc&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000"&gt;Ignorable&lt;/span&gt;&lt;span style="color:#0000ff"&gt;="d"&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#ff0000"&gt;d&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000"&gt;DataContext&lt;/span&gt;&lt;span style="color:#0000ff"&gt;="{&lt;/span&gt;&lt;span style="color:#a31515"&gt;d&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;DesignInstance&lt;/span&gt;&lt;span style="color:#ff0000"&gt; viewModels&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000"&gt;MainViewModelDesign&lt;/span&gt;&lt;span style="color:#0000ff"&gt;,&lt;/span&gt;&lt;span style="color:#ff0000"&gt; IsDesignTimeCreatable&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=True}"&lt;/span&gt; &lt;/li&gt; &lt;li&gt;    &lt;span style="color:#ff0000"&gt;DataContext&lt;/span&gt;&lt;span style="color:#0000ff"&gt;="{&lt;/span&gt;&lt;span style="color:#a31515"&gt;Binding&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Source&lt;/span&gt;&lt;span style="color:#0000ff"&gt;={&lt;/span&gt;&lt;span style="color:#a31515"&gt;StaticResource&lt;/span&gt;&lt;span style="color:#ff0000"&gt; locator}&lt;/span&gt;&lt;span style="color:#0000ff"&gt;,&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Path&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=MainViewModel}"&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Ovviamente possiamo ancora impostare la “solita” proprietà DataContext che verrà effettivamente utilizzata a runtime (riga 13).&lt;/p&gt;  &lt;p&gt;A questo punto se apro Visual Studio o Blend avrò pieno supporto del designer:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/martinobordin/Windows-Live-Writer/Blendability_8158/image_2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/martinobordin/Windows-Live-Writer/Blendability_8158/image_thumb.png" width="416" height="371" /&gt;&lt;/a&gt;      &lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/martinobordin/Windows-Live-Writer/Blendability_8158/image_4.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/martinobordin/Windows-Live-Writer/Blendability_8158/image_thumb_1.png" width="335" height="365" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Riassumendo:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;ho definito un ViewModel che eredita dal ViewModel reale, e si preoccupa solo di visualizzare i dati (e che andrò a mettere su un assembly a parte) ed eventuale logica di generazione dei dati fake (tra l’altro NBuilder è abbastanza versatile e posso definire regole del tipo “le prime 5 Person devono avere Name = “Nome123abc” e DateOfBirth = “01/02/2003”, le restanti Name = “blablabla") &lt;/li&gt;    &lt;li&gt;se farò refactoring non dovrò cambiare file XAML se non la View vera e propria &lt;/li&gt;    &lt;li&gt;ho il pieno supporto dei designer: editing di stili\template con preview instantanea, animazioni, property window, etc &lt;/li&gt;    &lt;li&gt;funziona per progetti WPF\ SL e WP7! &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Ho preparato un esempio un pò più articolato di quello illustrato che potete scaricare &lt;a href="http://goo.gl/hlyBb"&gt;qui&lt;/a&gt;. Ovviamente tutto quello che vedrete aprendo il designer NON lo vedrete a runtime &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-openmouthedsmile" alt="A bocca aperta" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/martinobordin/Windows-Live-Writer/Blendability_8158/wlEmoticon-openmouthedsmile_2.png" /&gt;.&lt;/p&gt;  &lt;p&gt;Cosa ne pensate? Come ottenete la blendability di solito nei vostri progetti?&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/martinobordin/aggbug/100261.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martino Bordin</dc:creator>
            <guid>http://blogs.ugidotnet.org/martinobordin/archive/2011/08/09/blendability-con-moq-e-nbuilder.aspx</guid>
            <pubDate>Tue, 09 Aug 2011 15:59:27 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/martinobordin/archive/2011/08/09/blendability-con-moq-e-nbuilder.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/martinobordin/comments/commentRss/100261.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/martinobordin/services/trackbacks/100261.aspx</trackback:ping>
        </item>
        <item>
            <title>Uno snippet per i routed event</title>
            <link>http://blogs.ugidotnet.org/martinobordin/archive/2010/08/19/uno-snippet-per-i-routed-event.aspx</link>
            <description>Come sapete i routed events sono, assieme alle dependency properties, 2  features molto importanti di WPF, fondamentali se dovete sviluppare  Custom Control.&lt;br /&gt;
Purtroppo la sintassi per dichiararli ed inizializzarli non è esattamente 'straightforward'.&lt;br /&gt;
&lt;br /&gt;
Grazie agli snippet di Visual Studio dichiarare una DependencyProperty è  un gioco da ragazzi..stranamente però non esiste uno snippet per i  Routed Events.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Poco male, potete scaricare lo snippet per i routed event &lt;a href="http://interactiveasp.net/blogs/natesstuff/archive/2008/10/15/routed-event-code-snippet.aspx" alt="Routed Event Snippet"&gt; qui&lt;/a&gt;&lt;img src="http://blogs.ugidotnet.org/martinobordin/aggbug/99091.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martino Bordin</dc:creator>
            <guid>http://blogs.ugidotnet.org/martinobordin/archive/2010/08/19/uno-snippet-per-i-routed-event.aspx</guid>
            <pubDate>Thu, 19 Aug 2010 19:18:40 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/martinobordin/archive/2010/08/19/uno-snippet-per-i-routed-event.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/martinobordin/comments/commentRss/99091.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/martinobordin/services/trackbacks/99091.aspx</trackback:ping>
        </item>
        <item>
            <title>Multibinding e StringFormat</title>
            <link>http://blogs.ugidotnet.org/martinobordin/archive/2010/08/19/multibinding-e-stringformat.aspx</link>
            <description>Dalla versione 3.5 SP1 del framework .NET è possibile utilizzare una nuova funzionalità detta MultiBinding.&lt;br /&gt;
&lt;br /&gt;
In che cosa consiste?&lt;br /&gt;
&lt;br /&gt;
Bhè, vi sarà capitato di dover visualizzare a video, magari tramite il  controllo TextBlock, informazioni contenute in proprietà distinte della  vostro origine dati (ovvero proprietà del ViewModel).&lt;br /&gt;
&lt;br /&gt;
Invece di utilizzare TextBlock, annidate dentro ad uno StackPanel,  distinte collegate ad ogni singola proprietà potrete usare questo  markup:&lt;br /&gt;
&lt;br /&gt;
&lt;img height="149" width="400" alt="Multibinding" src="/images/blogs_ugidotnet_org/martinobordin/Multibinding.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
Mediante la proprietà StringFormat potete controllare come viene  formattata la stringa, e utilizzando gli oggetti Binding potete  visualizzare tutte le proprietà che volete..comodo vero?&lt;br /&gt;
Ovviamente si possono utilizzare le canoniche FormatString .NET (es: {0:c}, {1:d}).&lt;br /&gt;
&lt;br /&gt;
Da notare le 2 parentesi graffe all'inizio della StringFormat...sono  necessari per evitare che il compilatore si arrabbi cercando di  interpretare le istruzioni come MarkupExtension.&lt;br /&gt;
&lt;br /&gt;
Alla prossima!&lt;img src="http://blogs.ugidotnet.org/martinobordin/aggbug/99090.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Martino Bordin</dc:creator>
            <guid>http://blogs.ugidotnet.org/martinobordin/archive/2010/08/19/multibinding-e-stringformat.aspx</guid>
            <pubDate>Thu, 19 Aug 2010 19:11:31 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/martinobordin/archive/2010/08/19/multibinding-e-stringformat.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/martinobordin/comments/commentRss/99090.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/martinobordin/services/trackbacks/99090.aspx</trackback:ping>
        </item>
    </channel>
</rss>