Invest in people before investing in tools http://blogs.ugidotnet.org/bmatte/Default.aspx Il blog di Matteo Baglini it-IT Matteo Baglini Subtext Version 2.6.0.0 Invest in people before investing in tools http://blogs.ugidotnet.org/images/RSS2Image.gif http://blogs.ugidotnet.org/bmatte/Default.aspx 77 60 Microsoft Community Tour: adesso tocca alla Toscana! Community .NET http://blogs.ugidotnet.org/bmatte/archive/2010/01/07/microsoft-community-tour-adesso-tocca-alla-toscana.aspx <p> </p> <p><img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://dotnettoscana.org/cfs-filesystemfile.ashx/__key/CommunityServer.Components.SiteFiles/JL_2D00_Prod_2D00_Prod_2D00_Ban_5F00_728x90.gif" /> </p> <p> </p> <p>Oggi molti di voi saranno rientrati dalle ferie, quindi ne approfitto per ricordare che Martedì 12 Gennaio si terrà a Navacchio (PI) la tappa Toscana del <a href="http://www.microsoft.com/italy/lancio09/community.aspx" target="_blank">Community Tour</a>.</p> <p>L’evento è interamente dedicato allo <strong>Sviluppo Web</strong>, se volete registrarvi o ricevere maggiori informazioni su sessioni e location, visitate l’apposita <a href="http://dotnettoscana.org/content/MicrosoftCommunityTour2009.aspx" target="_blank">pagina dell’evento</a> sul nostro sito.</p> <p>Vi aspettiamo!!</p> <p> </p> <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:d0ebb833-689e-4208-a4f4-8243337cc910" class="wlWriterEditableSmartContent">Technorati Tag: <a href="http://technorati.com/tags/Community+Tour" rel="tag">Community Tour</a>,<a href="http://technorati.com/tags/DotNetToscana" rel="tag">DotNetToscana</a>,<a href="http://technorati.com/tags/Eventi" rel="tag">Eventi</a></div><img src="http://blogs.ugidotnet.org/bmatte/aggbug/97816.aspx" width="1" height="1" /> Matteo Baglini http://blogs.ugidotnet.org/bmatte/archive/2010/01/07/microsoft-community-tour-adesso-tocca-alla-toscana.aspx Thu, 07 Jan 2010 17:43:28 GMT http://blogs.ugidotnet.org/bmatte/archive/2010/01/07/microsoft-community-tour-adesso-tocca-alla-toscana.aspx#feedback http://blogs.ugidotnet.org/bmatte/comments/commentRss/97816.aspx http://blogs.ugidotnet.org/bmatte/services/trackbacks/97816.aspx [OT] La Vera Storia della Legge di Murphy OT http://blogs.ugidotnet.org/bmatte/archive/2009/12/15/ot-la-vera-storia-della-legge-di-murphy.aspx <p>Non ne ero a conoscenza, spettacolo!!!</p> <p>Fonte: <a href="http://attivissimo.blogspot.com/2009/12/lorigine-della-legge-di-murphy.html">Perché la Legge di Murphy si chiama così</a></p><img src="http://blogs.ugidotnet.org/bmatte/aggbug/97722.aspx" width="1" height="1" /> Matteo Baglini http://blogs.ugidotnet.org/bmatte/archive/2009/12/15/ot-la-vera-storia-della-legge-di-murphy.aspx Tue, 15 Dec 2009 16:53:22 GMT http://blogs.ugidotnet.org/bmatte/archive/2009/12/15/ot-la-vera-storia-della-legge-di-murphy.aspx#feedback 2 http://blogs.ugidotnet.org/bmatte/comments/commentRss/97722.aspx http://blogs.ugidotnet.org/bmatte/services/trackbacks/97722.aspx FluentNHibernate, UserType e UserTypeConvention OpenSource http://blogs.ugidotnet.org/bmatte/archive/2009/10/02/fluentnhibernate-usertype-e-usertypeconvention.aspx <p>Sviluppando applicazioni con <a href="http://nhforge.org/" target="_blank">NHibernate</a> capita spesso di avere l’esingenza di creare uno UserType per mappare in modo particolare una classe. In questo post non mi interessa descrivere come realizzare uno UserType , basta fare una <a href="http://www.google.it/search?hl=it&amp;client=firefox-a&amp;rls=org.mozilla%3Ait%3Aofficial&amp;hs=V43&amp;q=nhibernate+usertype&amp;btnG=Cerca&amp;meta=" target="_blank">ricerca su google</a> per “essere sommersi” di guide, quello che voglio mostrare è la semplicità di mapping di uno UserType tramite <a href="http://fluentnhibernate.org/" target="_blank">FluentNHibernate</a> e la classe generica <a href="http://fluentnhibernate.org/api/FluentNHibernate.Conventions/UserTypeConvention%601.htm" target="_blank">UserTypeConvention&lt;TUserType&gt;.</a> Supponiamo di avere le classi Money e MoneyUserType, rispettivamente la classe da persistere e la definizione dello UserType, il mapping consiste semplicemente in qusto snippet di codice.</p> <div class="csharpcode"> <pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">public</span> <span class="kwrd">class</span> MoneyUserTypeConvention : UserTypeConvention&lt;MoneyUserType&gt;</pre> <pre><span class="lnum"> 2: </span>{</pre> <pre class="alt"><span class="lnum"> 3: </span>}</pre> </div> <div class="csharpcode"> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p>Il passo successivo è <a href="http://wiki.fluentnhibernate.org/Conventions" target="_blank">configuare opportunamente FluentNHibernate</a>. La curiosità però mi ha spinto ad indagare tramite Reflector cosa fa questa classe.</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/bmatte/WindowsLiveWriter/FluentNHibernateUserTypeeUserTypeConvent_E868/post1.png" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="post1" border="0" alt="post1" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/bmatte/WindowsLiveWriter/FluentNHibernateUserTypeeUserTypeConvent_E868/post1_thumb.png" width="244" height="222" /></a> </p> <p>Dall’immagine è chiaro che FluentNHibernate nel metodo Accept, utilizzato per capire se applicare quella determinata convenzione, crea una istanza di TUserType. Se abbiamo un numero elevato di UserType avremo anche un numero elevato di chiamate al metedo CreateInstance con conseguenti problemi di performance nella fase di creazione del mapping. Per ovviare a questo “problema” basta effettuare l’override del metodo e specificare esplicitamente il criterio di uguaglianza.</p> <div class="csharpcode"> <pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">public</span> <span class="kwrd">class</span> MoneyUserTypeConvention : UserTypeConvention&lt;MoneyUserType&gt;</pre> <pre><span class="lnum"> 2: </span>{</pre> <pre class="alt"><span class="lnum"> 3: </span> <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">bool</span> Accept(System.Type type)</pre> <pre><span class="lnum"> 4: </span> {</pre> <pre class="alt"><span class="lnum"> 5: </span> <span class="kwrd">return</span> type == <span class="kwrd">typeof</span> (Money);</pre> <pre><span class="lnum"> 6: </span> }</pre> <pre class="alt"><span class="lnum"> 7: </span>}</pre> </div> <p> </p><div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f24d655b-c25c-43d1-abcb-800f8043d7e1" class="wlWriterEditableSmartContent">Technorati Tag: <a href="http://technorati.com/tags/NHibernate" rel="tag">NHibernate</a>,<a href="http://technorati.com/tags/FluentNHibernate" rel="tag">FluentNHibernate</a>,<a href="http://technorati.com/tags/UserType" rel="tag">UserType</a>,<a href="http://technorati.com/tags/UserTypeConvention" rel="tag">UserTypeConvention</a></div><img src="http://blogs.ugidotnet.org/bmatte/aggbug/97161.aspx" width="1" height="1" /> Matteo Baglini http://blogs.ugidotnet.org/bmatte/archive/2009/10/02/fluentnhibernate-usertype-e-usertypeconvention.aspx Fri, 02 Oct 2009 17:31:39 GMT http://blogs.ugidotnet.org/bmatte/archive/2009/10/02/fluentnhibernate-usertype-e-usertypeconvention.aspx#feedback 1 http://blogs.ugidotnet.org/bmatte/comments/commentRss/97161.aspx http://blogs.ugidotnet.org/bmatte/services/trackbacks/97161.aspx Cena DotNetToscana http://blogs.ugidotnet.org/bmatte/archive/2009/05/04/cena-dotnettoscana.aspx <p>Altro incontro culinario dello User Group Toscano. <a href="http://dotnettoscana.org/user/Members.aspx?search=1&amp;t=*&amp;sb=1&amp;so=0" target="_blank">Il pubblico</a> <a href="http://dotnettoscana.org/forums/p/330/484.aspx" target="_blank">ha deciso</a> Pisa, quindi torniamo al ristorante della primissima cena a mangiare la tagliata ai funghi!!! <img alt="smile_teeth" src="http://spaces.live.com/rte/emoticons/smile_teeth.gif" /></p> <p>Tra un bicchiere di vino ed un pezzo di ciccia discuteremo a 360° del futuro della nostra Community.</p> <p>Dove?</p> <p><b>RISTORANTE PIZZERIA LA MANGIATOIA</b> <br />56124 Pisa (PI) - 20, v. Cuppari</p> <p><a href="http://maps.google.it/maps?f=q&amp;source=s_q&amp;hl=it&amp;geocode=&amp;q=RISTORANTE+PIZZERIA+LA+MANGIATOIA+pisa&amp;vps=2&amp;jsv=156c&amp;sll=41.902277,12.392578&amp;sspn=25.466562,56.953125&amp;ie=UTF8&amp;latlng=43707520,10421259,16169314688534001196&amp;ei=P7T-SfnpE5LYoAOkpr3XBQ&amp;cd=1" target="_blank">Mappa</a></p> <p>Quando?</p> <p><strong>Martedì 5 Maggio</strong> ore 21:00.</p> <p>Ci vediamo là! <img alt="smile_wink" src="http://spaces.live.com/rte/emoticons/smile_wink.gif" /></p><img src="http://blogs.ugidotnet.org/bmatte/aggbug/96099.aspx" width="1" height="1" /> Matteo Baglini http://blogs.ugidotnet.org/bmatte/archive/2009/05/04/cena-dotnettoscana.aspx Mon, 04 May 2009 12:35:14 GMT http://blogs.ugidotnet.org/bmatte/archive/2009/05/04/cena-dotnettoscana.aspx#feedback 1 http://blogs.ugidotnet.org/bmatte/comments/commentRss/96099.aspx http://blogs.ugidotnet.org/bmatte/services/trackbacks/96099.aspx Windows 7 Week - Installation Fest - Pisa Community Windows http://blogs.ugidotnet.org/bmatte/archive/2009/03/11/windows-7-week-installation-fest-pisa.aspx <p>Come già <a href="http://blogs.ugidotnet.org/marcom/archive/2009/03/11/windows-7-installation-fest-con-dotnettoscana.aspx" target="_blank">anticipato da Marco</a> l’evento <a href="http://www.microsoft.com/italy/eventi/installation/default.mspx" target="_blank">Windows 7 Week - Installation Fest</a> si svolgerà anche a Pisa, precisamente il 25 Marzo alle ore 18.00 presso il <a href="http://www.polotecnologico.it/">Polo Tecnologico</a> di Navacchio. Abbiamo appena finito di mettere online sul <a href="http://dotnettoscana.org/" target="_blank">nostro sito</a> la <a href="http://dotnettoscana.org/content/Windows7InstallationFest.aspx" target="_blank">pagina dell’evento</a>. L’agenda al momento non è dettagliata, ma lo sarà presto! </p> <p>Mi sento di sottolineare il fatto che è un evento gratutito e del tutto informale, quindi venite armati di PC e tanta voglia di Community, il divertimento è assicurato!! <img alt="smile_teeth" src="http://spaces.live.com/rte/emoticons/smile_teeth.gif" /></p> <p>PS: Propabilmente alcuni di noi (io<img alt="smile_wink" src="http://spaces.live.com/rte/emoticons/smile_wink.gif" />) saranno presenti anche alla tappa di Firenze, il 23 marzo alle ore 19.00</p> <div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:960a74db-d5b4-451d-8e89-f3fdec66e6aa" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati Tag: <a href="http://technorati.com/tags/DotNetToscana" rel="tag">DotNetToscana</a>,<a href="http://technorati.com/tags/Windows+7+Week" rel="tag">Windows 7 Week</a></div><img src="http://blogs.ugidotnet.org/bmatte/aggbug/95672.aspx" width="1" height="1" /> Matteo Baglini http://blogs.ugidotnet.org/bmatte/archive/2009/03/11/windows-7-week-installation-fest-pisa.aspx Wed, 11 Mar 2009 17:22:33 GMT http://blogs.ugidotnet.org/bmatte/archive/2009/03/11/windows-7-week-installation-fest-pisa.aspx#feedback 5 http://blogs.ugidotnet.org/bmatte/comments/commentRss/95672.aspx http://blogs.ugidotnet.org/bmatte/services/trackbacks/95672.aspx Premi al 1&deg; Workshop DotNetToscana http://blogs.ugidotnet.org/bmatte/archive/2009/02/12/premi-al-1deg-workshop-dotnettoscana.aspx <p>Potevamo arrivare al nostro <a href="http://dotnettoscana.org/content/MicrosoftNetFrameworkPresenteFuturo.aspx" target="_blank">1° Workshop</a> a mani vuote? Certo che no! </p> <p>Al termine dell’evento pomeridiano saranno “estratti” una serie di premi per i partecipanti.</p> <p>I premi disponibili sono:</p> <ul> <li><strong>6 vouchers</strong> offerti dalla<strong> </strong><a href="http://manning.com/" target="_blank"><strong>Manning</strong></a> validi per l’acquisto <strong>“for free”</strong> di un <strong>eBook</strong> fra i seguenti: <a href="http://manning.com/palermo/" target="_blank"><strong>ASP.NET MVC in Action</strong></a>, <a href="http://manning.com/campbell/" target="_blank"><strong>Silverlight 2 in Action</strong></a>. </li> <li><strong>1 licenza</strong> offerta da <a href="http://www.jetbrains.com/index.html" target="_blank"><strong>JetBrains</strong></a> per un prodotto a piacere fra: <strong>a. </strong><a href="http://www.jetbrains.com/resharper/" target="_blank"><strong>ReSharper Personal License</strong></a>,<strong> b. </strong><a href="http://www.jetbrains.com/profiler/" target="_blank"><strong>dotTrace Personal License</strong></a><strong> </strong>o <strong>c. </strong><a href="http://www.jetbrains.com/teamcity/" target="_blank"><strong>TeamCity Build Agent (for our Continuous Integration and Build Server)</strong></a>.</li> </ul> <p>Insomma, tanti motivi in più per non mancare!!! <img alt="smile_wink" src="http://spaces.live.com/rte/emoticons/smile_wink.gif" /></p> <div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:29959ed1-a189-4e96-87b4-f245ecd67437" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati Tag: <a href="http://technorati.com/tags/DotNetToscana" rel="tag">DotNetToscana</a>,<a href="http://technorati.com/tags/Workshop" rel="tag">Workshop</a></div><img src="http://blogs.ugidotnet.org/bmatte/aggbug/95455.aspx" width="1" height="1" /> Matteo Baglini http://blogs.ugidotnet.org/bmatte/archive/2009/02/12/premi-al-1deg-workshop-dotnettoscana.aspx Thu, 12 Feb 2009 21:09:35 GMT http://blogs.ugidotnet.org/bmatte/archive/2009/02/12/premi-al-1deg-workshop-dotnettoscana.aspx#feedback 1 http://blogs.ugidotnet.org/bmatte/comments/commentRss/95455.aspx http://blogs.ugidotnet.org/bmatte/services/trackbacks/95455.aspx WPF Functional Testing With White .NET Agile OpenSource http://blogs.ugidotnet.org/bmatte/archive/2008/12/18/wpf-functional-testing-with-white.aspx <p>(@ <a href="http://blogs.ugidotnet.org/dsantarelli" target="_blank">Dario</a>: accetto la sfida!!! <img alt="smile_teeth" src="http://spaces.live.com/rte/emoticons/smile_teeth.gif" /> )</p> <p>Nel mio <a href="http://blogs.ugidotnet.org/bmatte/archive/2008/12/16/wpf-ui-test-framework.aspx" target="_blank">ultimo post</a> ho annunciato il rilascio di un framework per effettuare test funzionali per applicazioni desktop in maniera del tutto automatica. <a href="http://blogs.ugidotnet.org/dsantarelli" target="_blank">Dario</a> ha accettato la mia <a href="http://blogs.ugidotnet.org/bmatte/archive/2008/12/16/wpf-ui-test-framework.aspx#1405390" target="_blank">richiesta</a> rispondendo con un bel <a href="http://blogs.ugidotnet.org/dsantarelli/archive/2008/12/17/testapi-e-input-injection.aspx" target="_blank">post su TestApi e Input Injection</a>. Tutto ciò mi ha messo voglia di provare a rifare il solito test da lui proposto, però utilizzando <a href="http://www.codeplex.com/white" target="_blank">white</a>, così possiamo confrontare i due framework. Cominciamo!!</p> <p>Prima di tutto lo screenshot della mia applicazione, non è proprio identica a quella di Dario, ma va benissimo!</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/bmatte/WindowsLiveWriter/UIFunctionalTestingWithWhite_12787/ui%20test_2.png" target="_blank"><img title="ui test" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="232" alt="ui test" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/bmatte/WindowsLiveWriter/UIFunctionalTestingWithWhite_12787/ui%20test_thumb.png" width="384" border="0" /></a> </p> <p>Come sappiamo, lo scopo del test è quello di:</p> <ol> <li>Lanciare l'applicazione </li> <li>Selezione della modalità di filtraggio (ovvero selezione di un item della ComboBox) </li> <li>Inserimento della filterExpression (typing nella TextBox) </li> <li>Click del Button di ricerca </li> <li>Valutazione dei risultati nella ListBox </li> </ol> <p>Niente di più facile!! <img alt="smile_wink" src="http://spaces.live.com/rte/emoticons/smile_wink.gif" /> Come per le <a href="http://www.codeplex.com/TestApi" target="_blank">TestApi</a>, per prima cosa nello XAML dobbiamo impostare per ogni elemento interessato l’Attached Properties <a href="http://msdn.microsoft.com/en-us/library/system.windows.automation.automationproperties.automationid.aspx" target="_blank">AutomationProperties.AutomationId</a>, successivamente aggiungiamo un progetto di tipo Class Library per i test. Aggiungiamo come reference al progetto le librerie Core.dll, White.NUnit.dll e nunit.framework.dll, quest’ultima libreria viene fornita insieme ai binari di <a href="http://www.codeplex.com/white" target="_blank">white</a> però in realtà fa parte del framework <a href="http://www.nunit.org/" target="_blank">NUnit</a>. Adesso non ci resta che aggiungere una nuava classe e scrivere il metodo di test come mostrato nel seguente snippet:</p> <div class="csharpcode"> <pre class="alt"><span class="lnum"> 1: </span>[TestFixture]</pre> <pre><span class="lnum"> 2: </span><span class="kwrd">public</span> <span class="kwrd">class</span> MainWindowTests</pre> <pre class="alt"><span class="lnum"> 3: </span>{</pre> <pre><span class="lnum"> 4: </span> <span class="kwrd">private</span> <span class="kwrd">const</span> <span class="kwrd">string</span> path = <span class="str">@"C:\…\WhiteDemoWithWpf.exe"</span>;</pre> <pre class="alt"><span class="lnum"> 5: </span> </pre> <pre><span class="lnum"> 6: </span> [Test]</pre> <pre class="alt"><span class="lnum"> 7: </span> <span class="kwrd">public</span> <span class="kwrd">void</span> When_click_search_should_filter_loaded_data_by_selected_mode_and_typed_expression()</pre> <pre><span class="lnum"> 8: </span> {</pre> <pre class="alt"><span class="lnum"> 9: </span> <span class="kwrd">string</span> productNameToMatch = <span class="str">"Chang"</span>;</pre> <pre><span class="lnum"> 10: </span> </pre> <pre class="alt"><span class="lnum"> 11: </span> <span class="rem">//Esecuzione dell'applicazione</span></pre> <pre><span class="lnum"> 12: </span> var application = Application.Launch(path);</pre> <pre class="alt"><span class="lnum"> 13: </span> </pre> <pre><span class="lnum"> 14: </span> <span class="rem">//Ottengo la Window e verifico che non sia Null</span></pre> <pre class="alt"><span class="lnum"> 15: </span> var window = application.GetWindow(<span class="str">"MainWindow"</span>, InitializeOption.NoCache);</pre> <pre><span class="lnum"> 16: </span> Assert.That(window,Is.Not.Null);</pre> <pre class="alt"><span class="lnum"> 17: </span> </pre> <pre><span class="lnum"> 18: </span> <span class="rem">//Seleziono un elemento della ComboBox</span></pre> <pre class="alt"><span class="lnum"> 19: </span> var lstFilterCriteria = window.Get&lt;ComboBox&gt;(<span class="str">"lstFilterCriteria"</span>);</pre> <pre><span class="lnum"> 20: </span> lstFilterCriteria.Select(3);</pre> <pre class="alt"><span class="lnum"> 21: </span> </pre> <pre><span class="lnum"> 22: </span> <span class="rem">//Scrivo il Product Name per il test</span></pre> <pre class="alt"><span class="lnum"> 23: </span> var txtProductName = window.Get&lt;TextBox&gt;(<span class="str">"txtProductName"</span>);</pre> <pre><span class="lnum"> 24: </span> txtProductName.Text = productNameToMatch;</pre> <pre class="alt"><span class="lnum"> 25: </span> </pre> <pre><span class="lnum"> 26: </span> <span class="rem">//Clicco il Button per effettuare la ricerca</span></pre> <pre class="alt"><span class="lnum"> 27: </span> var btnFilterProducts = window.Get&lt;Button&gt;(<span class="str">"btnFilterProducts"</span>);</pre> <pre><span class="lnum"> 28: </span> btnFilterProducts.Click();</pre> <pre class="alt"><span class="lnum"> 29: </span> </pre> <pre><span class="lnum"> 30: </span> <span class="rem">//Verifico che il numero totale di elementi della lista sia 1</span></pre> <pre class="alt"><span class="lnum"> 31: </span> var listViewProducts = window.Get&lt;ListView&gt;(<span class="str">"listViewProducts"</span>);</pre> <pre><span class="lnum"> 32: </span> Assert.That(listViewProducts.Rows.Count, Is.EqualTo(1));</pre> <pre class="alt"><span class="lnum"> 33: </span> </pre> <pre><span class="lnum"> 34: </span> <span class="rem">//Verifico il contenuto della cella contenente </span></pre> <pre class="alt"><span class="lnum"> 35: </span> <span class="rem">//il risultato della ricerca con il Product Name per il test</span></pre> <pre><span class="lnum"> 36: </span> var cell = listViewProducts.Rows[0].Cells[0];</pre> <pre class="alt"><span class="lnum"> 37: </span> Assert.That(cell.Text, Is.EqualTo(productNameToMatch));</pre> <pre><span class="lnum"> 38: </span> </pre> <pre class="alt"><span class="lnum"> 39: </span> <span class="rem">//Chiudo l'applicazione</span></pre> <pre><span class="lnum"> 40: </span> application.Kill();</pre> <pre class="alt"><span class="lnum"> 41: </span> }</pre> <pre><span class="lnum"> 42: </span>}</pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p>I commenti descrivono chiaramente la logica del metodo. Lanciamo il test (sempre con le mani dietro alla testa <img alt="smile_wink" src="http://spaces.live.com/rte/emoticons/smile_wink.gif" />) e godiamoci il risultato:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/bmatte/WindowsLiveWriter/UIFunctionalTestingWithWhite_12787/CropperCapture%5B1%5D.png" target="_blank"><img title="CropperCapture[1]" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="196" alt="CropperCapture[1]" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/bmatte/WindowsLiveWriter/UIFunctionalTestingWithWhite_12787/CropperCapture%5B1%5D_thumb.png" width="862" border="0" /></a> </p> <p /> <p>Le prime tre righe sono “problemi” di <a href="http://www.codeplex.com/white/Wiki/View.aspx?title=Configuration&amp;referringTitle=Home" target="_blank">confgurazione</a> non essenziali per questa demo. </p> <p>Confrontando il solito metodo di test scritto con i due framework devo dire che <a href="http://www.codeplex.com/white" target="_blank">white</a> al momento offre un modello di pilotaggio della UI molto più ricco e semplice da utilizzare. Atro aspetto interessante è che <a href="http://www.codeplex.com/white" target="_blank">white</a> permette di testare anche applicazioni Java scritte in SWT!!</p> <p>Devo ammettere che vedere l’applicazione vivere di vita propria fa un certo effetto!!! <img alt="smile_teeth" src="http://spaces.live.com/rte/emoticons/smile_teeth.gif" /></p> <div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:79cbd1a6-410f-4088-86e4-0e83dd6c8349" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati Tag: <a href="http://technorati.com/tags/WPF" rel="tag">WPF</a>,<a href="http://technorati.com/tags/Windows+Presentation+Foundation" rel="tag">Windows Presentation Foundation</a>,<a href="http://technorati.com/tags/FunctionalTest" rel="tag">FunctionalTest</a>,<a href="http://technorati.com/tags/White" rel="tag">White</a></div><img src="http://blogs.ugidotnet.org/bmatte/aggbug/94978.aspx" width="1" height="1" /> Matteo Baglini http://blogs.ugidotnet.org/bmatte/archive/2008/12/18/wpf-functional-testing-with-white.aspx Thu, 18 Dec 2008 23:23:02 GMT http://blogs.ugidotnet.org/bmatte/archive/2008/12/18/wpf-functional-testing-with-white.aspx#feedback 2 http://blogs.ugidotnet.org/bmatte/comments/commentRss/94978.aspx http://blogs.ugidotnet.org/bmatte/services/trackbacks/94978.aspx WPF UI Test Framework OpenSource Agile .NET http://blogs.ugidotnet.org/bmatte/archive/2008/12/16/wpf-ui-test-framework.aspx <p><a href="http://blogs.msdn.com/ivo_manolov/archive/2008/12/06/9181396.aspx" target="_blank">Ivo Manolov annumcia</a> sul proprio blog il <a href="http://www.codeplex.com/TestApi" target="_blank">rilascio di un tool open source</a> per automatizzare il test della UI sia essa in WPF pittosto che WinForm. Sempre sul suo blog potete leggere il <a href="http://blogs.msdn.com/ivo_manolov/archive/2008/12/15/9223397.aspx" target="_blank">primo post guida</a> del tool. Da questi post ho scoperto che esiste un <a href="http://blogs.msdn.com/wpftesting/" target="_blank">blog su MSDN dedicato al testing di WPF</a>. </p> <p>Esisteva già un tool open surce simile si chiama <a href="http://www.codeplex.com/white" target="_blank">white ed anche questo è hostato su CodePlex</a>.</p> <div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f3edd854-9fff-40ea-bb0c-b788235ffd4d" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati Tag: <a href="http://technorati.com/tags/UnitTest" rel="tag">UnitTest</a>,<a href="http://technorati.com/tags/UI+Test" rel="tag">UI Test</a></div><img src="http://blogs.ugidotnet.org/bmatte/aggbug/94957.aspx" width="1" height="1" /> Matteo Baglini http://blogs.ugidotnet.org/bmatte/archive/2008/12/16/wpf-ui-test-framework.aspx Tue, 16 Dec 2008 17:02:24 GMT http://blogs.ugidotnet.org/bmatte/archive/2008/12/16/wpf-ui-test-framework.aspx#feedback 3 http://blogs.ugidotnet.org/bmatte/comments/commentRss/94957.aspx http://blogs.ugidotnet.org/bmatte/services/trackbacks/94957.aspx Google C++ Mocking Framework Agile OpenSource http://blogs.ugidotnet.org/bmatte/archive/2008/12/16/google-c-mocking-framework.aspx <p>Ricordate il <a href="http://blogs.ugidotnet.org/bmatte/archive/2008/07/16/google-c-testing-framework.aspx" target="_blank">Google C++ Test Framework</a>? Bene! Adesso il Team di Google ha rilasciato anche un framework di <a href="http://googletesting.blogspot.com/2008/12/announcing-google-c-mocking-framework.html" target="_blank">Mocking per C++</a>. </p> <p>Vediamo se mi sarà utilie nella solita applicazione C++ che ho menzionato nel post passato.</p> <div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:5ffd4db2-4d85-4c2d-88f2-fdf326ecf930" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati Tag: <a href="http://technorati.com/tags/Mocks" rel="tag">Mocks</a>,<a href="http://technorati.com/tags/UnitTest" rel="tag">UnitTest</a>,<a href="http://technorati.com/tags/TDD" rel="tag">TDD</a></div><img src="http://blogs.ugidotnet.org/bmatte/aggbug/94955.aspx" width="1" height="1" /> Matteo Baglini http://blogs.ugidotnet.org/bmatte/archive/2008/12/16/google-c-mocking-framework.aspx Tue, 16 Dec 2008 16:45:45 GMT http://blogs.ugidotnet.org/bmatte/archive/2008/12/16/google-c-mocking-framework.aspx#feedback 1 http://blogs.ugidotnet.org/bmatte/comments/commentRss/94955.aspx http://blogs.ugidotnet.org/bmatte/services/trackbacks/94955.aspx [OT] Dopo tanti giorni di mal tempo&hellip; OT http://blogs.ugidotnet.org/bmatte/archive/2008/12/07/ot-dopo-tanti-giorni-di-mal-tempohellip.aspx <p>….una meravigliosa Domenica di sole!! Clima perfetto per andare a passare la giornata in riva al mare!! <img alt="smile_shades" src="http://spaces.live.com/rte/emoticons/smile_shades.gif" /> Ecco qualche foto (perdonate la qualità, sono fatte con il cellulare) del Romito, la fantastica scogliera Livornese.</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/bmatte/WindowsLiveWriter/OTDopotantigiornidimaltempo_11ADC/Fotografie-0031_2.jpg" target="_blank"><img title="Fotografie-0031" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="244" alt="Fotografie-0031" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/bmatte/WindowsLiveWriter/OTDopotantigiornidimaltempo_11ADC/Fotografie-0031_thumb.jpg" width="184" border="0" /></a> <a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/bmatte/WindowsLiveWriter/OTDopotantigiornidimaltempo_11ADC/Fotografie-0029_2.jpg" target="_blank"><img title="Fotografie-0029" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="244" alt="Fotografie-0029" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/bmatte/WindowsLiveWriter/OTDopotantigiornidimaltempo_11ADC/Fotografie-0029_thumb.jpg" width="184" border="0" /></a> <a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/bmatte/WindowsLiveWriter/OTDopotantigiornidimaltempo_11ADC/Fotografie-0030_2.jpg" target="_blank"><img title="Fotografie-0030" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="244" alt="Fotografie-0030" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/bmatte/WindowsLiveWriter/OTDopotantigiornidimaltempo_11ADC/Fotografie-0030_thumb.jpg" width="184" border="0" /></a> <a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/bmatte/WindowsLiveWriter/OTDopotantigiornidimaltempo_11ADC/Fotografie-0033_2.jpg" target="_blank"><img title="Fotografie-0033" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="244" alt="Fotografie-0033" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/bmatte/WindowsLiveWriter/OTDopotantigiornidimaltempo_11ADC/Fotografie-0033_thumb.jpg" width="184" border="0" /></a> </p> <p /> <p /> <p>E dopo il mare, mi preparo (fisicamente e mentalmente) a domani…una bella giornata di snowboard al <a href="http://www.cimonesci.it/" target="_blank">Cimone</a> mi aspetta!! <img alt="smile_teeth" src="http://spaces.live.com/rte/emoticons/smile_teeth.gif" /></p><img src="http://blogs.ugidotnet.org/bmatte/aggbug/94872.aspx" width="1" height="1" /> Matteo Baglini http://blogs.ugidotnet.org/bmatte/archive/2008/12/07/ot-dopo-tanti-giorni-di-mal-tempohellip.aspx Sun, 07 Dec 2008 21:09:01 GMT http://blogs.ugidotnet.org/bmatte/archive/2008/12/07/ot-dopo-tanti-giorni-di-mal-tempohellip.aspx#feedback 1 http://blogs.ugidotnet.org/bmatte/comments/commentRss/94872.aspx http://blogs.ugidotnet.org/bmatte/services/trackbacks/94872.aspx Google Testing Blog - Clean Code Talks Agile http://blogs.ugidotnet.org/bmatte/archive/2008/12/02/google-testing-blog-clean-code-talks.aspx <p>Chiunque di voi scriva test unitari per il proprio codice (perché esiste ancora qualcuno che non lo fa?? <img alt="smile_wink" src="http://spaces.live.com/rte/emoticons/smile_wink.gif" />) consiglio questi brevi video di Google:</p> <h4><a href="http://googletesting.blogspot.com/2008/11/clean-code-talks-unit-testing.html" target="_blank">Clean Code Talks - Unit Testing</a></h4> <h4><a href="http://googletesting.blogspot.com/2008/11/clean-code-talks-dependency-injection.html" target="_blank">Clean Code Talks - Dependency Injection</a></h4> <h4><a href="http://googletesting.blogspot.com/2008/11/clean-code-talks-global-state-and.html" target="_blank">Clean Code Talks - Global State and Singletons</a></h4> <div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:d9aa398a-7f96-4e78-94c7-59f3d592192f" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati Tag: <a href="http://technorati.com/tags/UnitTest" rel="tag">UnitTest</a>,<a href="http://technorati.com/tags/DependencyInjection" rel="tag">DependencyInjection</a>,<a href="http://technorati.com/tags/Pattern" rel="tag">Pattern</a></div><img src="http://blogs.ugidotnet.org/bmatte/aggbug/94828.aspx" width="1" height="1" /> Matteo Baglini http://blogs.ugidotnet.org/bmatte/archive/2008/12/02/google-testing-blog-clean-code-talks.aspx Tue, 02 Dec 2008 17:17:13 GMT http://blogs.ugidotnet.org/bmatte/archive/2008/12/02/google-testing-blog-clean-code-talks.aspx#feedback 3 http://blogs.ugidotnet.org/bmatte/comments/commentRss/94828.aspx http://blogs.ugidotnet.org/bmatte/services/trackbacks/94828.aspx Pattern Model-View-ViewModel, INotifyPropertyChanged, Static Reflection e Extension methods .NET http://blogs.ugidotnet.org/bmatte/archive/2008/11/28/pattern-model-view-viewmodel-inotifypropertychanged-static-reflection-e-extension-methods.aspx <p>Anch’io nei miei progetti WPF per rendere testabile la logica della mia applicazione senza rinunciare alla pontenza del <em>DataBinding</em> utilizzo (anche) il Pattern Model-View-ViewModel. L’interfaccia <em>INotifyPropertyChanged</em> gioca un ruolo fondamentale nell’implementazione di questo pattern quindi ne faccio un uso massiccio. Quello che non mi è mai piaciuto di questa interfaccia è l’uso delle stringe per indicare qual è la proprietà modificata, vediamo un semplice esempio dell’uso di INotifyPropertyChanged:</p> <div class="csharpcode"> <pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">public</span> <span class="kwrd">class</span> Person : INotifyPropertyChanged {</pre> <pre><span class="lnum"> 2: </span> <span class="kwrd">public</span> <span class="kwrd">event</span> PropertyChangedEventHandler PropertyChanged;</pre> <pre class="alt"><span class="lnum"> 3: </span> </pre> <pre><span class="lnum"> 4: </span> <span class="kwrd">private</span> <span class="kwrd">string</span> firstName = String.Empty;</pre> <pre class="alt"><span class="lnum"> 5: </span> <span class="kwrd">public</span> <span class="kwrd">string</span> FirstName {</pre> <pre><span class="lnum"> 6: </span> get { <span class="kwrd">return</span> firstName; }</pre> <pre class="alt"><span class="lnum"> 7: </span> set {</pre> <pre><span class="lnum"> 8: </span> <span class="kwrd">if</span> (firstName != <span class="kwrd">value</span>) {</pre> <pre class="alt"><span class="lnum"> 9: </span> firstName = <span class="kwrd">value</span>;</pre> <pre><span class="lnum"> 10: </span> RaisePropertyChanged(<span class="str">"FirstName"</span>);</pre> <pre class="alt"><span class="lnum"> 11: </span> }</pre> <pre><span class="lnum"> 12: </span> }</pre> <pre class="alt"><span class="lnum"> 13: </span> }</pre> <pre><span class="lnum"> 14: </span> </pre> <pre class="alt"><span class="lnum"> 15: </span> <span class="kwrd">private</span> <span class="kwrd">void</span> RaisePropertyChanged(<span class="kwrd">string</span> propertyName) {</pre> <pre><span class="lnum"> 16: </span> <span class="kwrd">if</span> (PropertyChanged != <span class="kwrd">null</span>)</pre> <pre class="alt"><span class="lnum"> 17: </span> PropertyChanged(<span class="kwrd">this</span>, <span class="kwrd">new</span> PropertyChangedEventArgs(propertyName));</pre> <pre><span class="lnum"> 18: </span> }</pre> <pre class="alt"><span class="lnum"> 19: </span>}</pre> </div> <p /> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p /> <p>Se cambio il nome della proprietà <em>FirstName</em> Visual Studio si accorge del cambiamento e mi permette con un solo click di rinominare la proprietà ovunque venga utilizzata, però questo sistema di <em>refactoring</em> non è abbastanza <em>smart</em> da modificare la stringa <em>FirstName</em> (riga 10). Grazie alla <a href="http://ayende.com/Blog/archive/2005/10/29/StaticReflection.aspx" target="_blank">Static Reflection</a> possiamo eliminare questo problema, il “trucco” sta nel passare al metodo <em>RaisePropertyChanged</em> la proprietà come tipo <em><a href="http://msdn.microsoft.com/en-us/library/bb335710.aspx" target="_blank">Expression&lt;Func&lt;T&gt;&gt;</a>,</em> convertire successivamente il <em><a href="http://msdn.microsoft.com/en-us/library/system.linq.expressions.lambdaexpression.body.aspx" target="_blank">Body</a></em> nel tipo <em><a href="http://msdn.microsoft.com/en-us/library/system.linq.expressions.memberexpression.aspx" target="_blank">MemberExpression</a></em> ed in fine recuperare il nome tramite le proprietà <em><a href="http://msdn.microsoft.com/en-us/library/system.linq.expressions.memberexpression.member.aspx" target="_blank">Member</a></em>. Risultato:</p> <div class="csharpcode"> <pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">public</span> <span class="kwrd">class</span> Person : INotifyPropertyChanged {</pre> <pre><span class="lnum"> 2: </span> <span class="kwrd">public</span> <span class="kwrd">event</span> PropertyChangedEventHandler PropertyChanged;</pre> <pre class="alt"><span class="lnum"> 3: </span> </pre> <pre><span class="lnum"> 4: </span> <span class="kwrd">private</span> <span class="kwrd">string</span> firstName = String.Empty;</pre> <pre class="alt"><span class="lnum"> 5: </span> <span class="kwrd">public</span> <span class="kwrd">string</span> FirstName {</pre> <pre><span class="lnum"> 6: </span> get { <span class="kwrd">return</span> firstName; }</pre> <pre class="alt"><span class="lnum"> 7: </span> set {</pre> <pre><span class="lnum"> 8: </span> <span class="kwrd">if</span> (firstName != <span class="kwrd">value</span>) {</pre> <pre class="alt"><span class="lnum"> 9: </span> firstName = <span class="kwrd">value</span>;</pre> <pre><span class="lnum"> 10: </span> RaisePropertyChanged(() =&gt; FirstName);</pre> <pre class="alt"><span class="lnum"> 11: </span> }</pre> <pre><span class="lnum"> 12: </span> }</pre> <pre class="alt"><span class="lnum"> 13: </span> }</pre> <pre><span class="lnum"> 14: </span> </pre> <pre class="alt"><span class="lnum"> 15: </span> <span class="kwrd">private</span> <span class="kwrd">void</span> RaisePropertyChanged&lt;T&gt;(Expression&lt;Func&lt;T&gt;&gt; property) { </pre> <pre><span class="lnum"> 16: </span> var expression = property.Body <span class="kwrd">as</span> MemberExpression;</pre> <pre class="alt"><span class="lnum"> 17: </span> var member = expression.Member;</pre> <pre><span class="lnum"> 18: </span> <span class="kwrd">if</span> (PropertyChanged != <span class="kwrd">null</span>)</pre> <pre class="alt"><span class="lnum"> 19: </span> PropertyChanged(<span class="kwrd">this</span>, <span class="kwrd">new</span> PropertyChangedEventArgs(member.Name));</pre> <pre><span class="lnum"> 20: </span> }</pre> <pre class="alt"><span class="lnum"> 21: </span>}</pre> </div> <p /><style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style>Adesso il nostro codice supporta pienamente il <em>rename refactoring</em>. Come ultimo passo possiamo incapsulare la logica di manipolazione dei tipi <em>Expression</em> in un <em>Extension methods </em>rendendo il codice molto più leggibile: <div class="csharpcode"> <pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">class</span> PropertyExtensions {</pre> <pre><span class="lnum"> 2: </span> <span class="kwrd">public</span> <span class="kwrd">static</span> PropertyChangedEventArgs CreateChangeEventArgs&lt;T&gt;(<span class="kwrd">this</span> Expression&lt;Func&lt;T&gt;&gt; property) {</pre> <pre class="alt"><span class="lnum"> 3: </span> var expression = property.Body <span class="kwrd">as</span> MemberExpression;</pre> <pre><span class="lnum"> 4: </span> var member = expression.Member;</pre> <pre class="alt"><span class="lnum"> 5: </span> <span class="kwrd">return</span> <span class="kwrd">new</span> PropertyChangedEventArgs(member.Name);</pre> <pre><span class="lnum"> 6: </span> }</pre> <pre class="alt"><span class="lnum"> 7: </span>}</pre> <pre><span class="lnum"> 8: </span> </pre> <pre class="alt"><span class="lnum"> 9: </span><span class="kwrd">public</span> <span class="kwrd">class</span> Person : INotifyPropertyChanged {</pre> <pre><span class="lnum"> 10: </span> <span class="kwrd">public</span> <span class="kwrd">event</span> PropertyChangedEventHandler PropertyChanged;</pre> <pre class="alt"><span class="lnum"> 11: </span> </pre> <pre><span class="lnum"> 12: </span> <span class="kwrd">private</span> <span class="kwrd">string</span> firstName = String.Empty;</pre> <pre class="alt"><span class="lnum"> 13: </span> <span class="kwrd">public</span> <span class="kwrd">string</span> FirstName {</pre> <pre><span class="lnum"> 14: </span> get { <span class="kwrd">return</span> firstName; }</pre> <pre class="alt"><span class="lnum"> 15: </span> set {</pre> <pre><span class="lnum"> 16: </span> <span class="kwrd">if</span> (firstName != <span class="kwrd">value</span>) {</pre> <pre class="alt"><span class="lnum"> 17: </span> firstName = <span class="kwrd">value</span>;</pre> <pre><span class="lnum"> 18: </span> RaisePropertyChanged(() =&gt; FirstName);</pre> <pre class="alt"><span class="lnum"> 19: </span> }</pre> <pre><span class="lnum"> 20: </span> }</pre> <pre class="alt"><span class="lnum"> 21: </span> }</pre> <pre><span class="lnum"> 22: </span> </pre> <pre class="alt"><span class="lnum"> 23: </span> <span class="kwrd">private</span> <span class="kwrd">void</span> RaisePropertyChanged&lt;T&gt;(Expression&lt;Func&lt;T&gt;&gt; property) { </pre> <pre><span class="lnum"> 24: </span> <span class="kwrd">if</span> (PropertyChanged != <span class="kwrd">null</span>)</pre> <pre class="alt"><span class="lnum"> 25: </span> PropertyChanged(<span class="kwrd">this</span>, property.CreateChangeEventArgs());</pre> <pre><span class="lnum"> 26: </span> }</pre> <pre class="alt"><span class="lnum"> 27: </span>}</pre> </div> <p /> <div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:06f17728-e2aa-4822-ac20-75f4fcc5d3ad" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati Tag: <a href="http://technorati.com/tags/Model-View-ViewModel" rel="tag">Model-View-ViewModel</a>,<a href="http://technorati.com/tags/M-V-VM" rel="tag">M-V-VM</a>,<a href="http://technorati.com/tags/Extension+Methods" rel="tag">Extension Methods</a>,<a href="http://technorati.com/tags/INotifyPropertyChanged" rel="tag">INotifyPropertyChanged</a>,<a href="http://technorati.com/tags/Expression" rel="tag">Expression</a></div><img src="http://blogs.ugidotnet.org/bmatte/aggbug/94787.aspx" width="1" height="1" /> Matteo Baglini http://blogs.ugidotnet.org/bmatte/archive/2008/11/28/pattern-model-view-viewmodel-inotifypropertychanged-static-reflection-e-extension-methods.aspx Fri, 28 Nov 2008 16:06:28 GMT http://blogs.ugidotnet.org/bmatte/archive/2008/11/28/pattern-model-view-viewmodel-inotifypropertychanged-static-reflection-e-extension-methods.aspx#feedback 13 http://blogs.ugidotnet.org/bmatte/comments/commentRss/94787.aspx http://blogs.ugidotnet.org/bmatte/services/trackbacks/94787.aspx WPF Effects Library .NET http://blogs.ugidotnet.org/bmatte/archive/2008/10/23/wpf-effects-library.aspx Una delle <a target="_blank" href="http://windowsclient.net/wpf/wpf35/wpf-whats-new-35sp1.aspx">novità di WPF 3.5 SP1</a> sono gli Shader Effects, adesso il Team di WPF ha pubblicato su <a target="_blank" href="http://www.codeplex.com/">CodePlex</a> la <a target="_blank" href="http://www.codeplex.com/wpffx">Windows Presentation Foundation Pixel Shader Effects Library</a>, una libreria  contenente molti Shader Effects, direttamente dalla home del progetto: <p>Initial seed includes: <br /> Effects: <br /> BandedSwirl, Bloom, BrightExtract, ColorKeyAlpha, ColorTone, ContrastAdjust, DirectionalBlur, Embossed, Gloom, GrowablePoissonDiskEffect, InvertColor, LightStreak, Magnify, Monochrome, Pinch, Pixelate, Ripple, Sharpen, SmoothMagnify, Swirl, Tone, Toon, and ZoomBlur <br /> Transition Effects: <br /> BandedSwirl, Blings, Blood, CircleReveal, CircleStretch, CircularBlur, CloudReveral, Cloudy, Crumble, Dissolve, DropFade, Fade, LeastBright, LineReveal, MostBright, PixelateIn, PixelateOut, Pixelate, RadialBlur, RadialWiggle, RandomCircleReveal, Ripple, Rotate, Saturate, Shrink, SlideIn, SmoothSwirl, Swirl, Water, Wave. </p> <p>Ora non resta che provarli tutti <img src="http://spaces.live.com/rte/emoticons/smile_teeth.gif" alt="smile_teeth" />.</p> <div style="margin: 0px; padding: 0px; display: inline; float: none;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:444a6ae9-6664-415d-8b8a-b0d9cb107bfb" class="wlWriterEditableSmartContent">Technorati Tag: <a rel="tag" href="http://technorati.com/tags/WPF">WPF</a>,<a rel="tag" href="http://technorati.com/tags/Windows+Presentation+Foundation">Windows Presentation Foundation</a>,<a rel="tag" href="http://technorati.com/tags/Shader+Effects">Shader Effects</a></div><img src="http://blogs.ugidotnet.org/bmatte/aggbug/94837.aspx" width="1" height="1" /> Matteo Baglini http://blogs.ugidotnet.org/bmatte/archive/2008/10/23/wpf-effects-library.aspx Thu, 23 Oct 2008 10:47:00 GMT http://blogs.ugidotnet.org/bmatte/archive/2008/10/23/wpf-effects-library.aspx#feedback 1 http://blogs.ugidotnet.org/bmatte/comments/commentRss/94837.aspx http://blogs.ugidotnet.org/bmatte/services/trackbacks/94837.aspx Pubblicati i sorgenti del controllo WatermarkedTextBox .NET http://blogs.ugidotnet.org/bmatte/archive/2008/10/22/pubblicati-i-sorgenti-del-controllo-watermarkedtextbox.aspx Fra i vari controlli presenti nelle prime versioni di Silverlight c’era la WatermarkedTextBox. Dalla release Beta2 tale controllo è stato rimosso. Adesso, pressati dalle forti richieste, il team di Silverlight ha rilasciato il codice sorgente del suddetto controllo. <ul> <li>Sorgenti: <a href="http://s3.amazonaws.com/timheuer-img/WatermarkedTextBox-Source.zip">WatermarkedTextBox-Source.zip</a></li> <li>Binari: <a href="http://s3.amazonaws.com/timheuer-img/WatermarkedTextBox-Binary.zip">WatermarkedTextBox-Binary.zip</a></li> </ul> <p>Fonte: <a href="http://timheuer.com/blog/archive/2008/10/22/silverlight-watermark-text-box-control.aspx" target="_blank">Silverlight 2 Watermarked TextBox Control</a></p> <div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e686344b-7a42-45bd-8696-9b52f54809db" style="margin: 0px; padding: 0px; display: inline; float: none;">Technorati Tag: <a href="http://technorati.com/tags/Silverlight" rel="tag">Silverlight</a></div><img src="http://blogs.ugidotnet.org/bmatte/aggbug/94836.aspx" width="1" height="1" /> Matteo Baglini http://blogs.ugidotnet.org/bmatte/archive/2008/10/22/pubblicati-i-sorgenti-del-controllo-watermarkedtextbox.aspx Wed, 22 Oct 2008 22:27:00 GMT http://blogs.ugidotnet.org/bmatte/archive/2008/10/22/pubblicati-i-sorgenti-del-controllo-watermarkedtextbox.aspx#feedback http://blogs.ugidotnet.org/bmatte/comments/commentRss/94836.aspx http://blogs.ugidotnet.org/bmatte/services/trackbacks/94836.aspx [WPF] Intercettare l’evento MouseDoubleClick di un ListBoxItem .NET http://blogs.ugidotnet.org/bmatte/archive/2008/10/22/wpf-intercettare-levento-mousedoubleclick-di-un-listboxitem.aspx <p>Visual Studio 2008 Sp1 non visualizza l’evento MouseDoubleClick per un ListBoxITem, come se non esistesse:</p> <p> <a href="../../../../images/blogs_ugidotnet_org/bmatte/WindowsLiveWriter/a560dea00ac4_11015/ListBoxITemMouseDoubleClick_2.png"><img height="62" border="0" width="244" src="../../../../images/blogs_ugidotnet_org/bmatte/WindowsLiveWriter/a560dea00ac4_11015/ListBoxITemMouseDoubleClick_thumb.png" alt="ListBoxITemMouseDoubleClick" style="border-width: 0px; display: inline;" title="ListBoxITemMouseDoubleClick" /></a> </p> <p>In realtà tale evento esiste, è solo un problema di IntelliSense, quindi basta digitare il nome e tutto funziona:</p> <p> <a href="../../../../images/blogs_ugidotnet_org/bmatte/WindowsLiveWriter/a560dea00ac4_11015/ListBoxITemMouseDoubleClick2_2.png"><img height="52" border="0" width="244" src="../../../../images/blogs_ugidotnet_org/bmatte/WindowsLiveWriter/a560dea00ac4_11015/ListBoxITemMouseDoubleClick2_thumb.png" alt="ListBoxITemMouseDoubleClick2" style="border-width: 0px; display: inline;" title="ListBoxITemMouseDoubleClick2" /></a> </p> <p>Al seguente url è disponibile una piccola demo: <a target="_blank" href="http://makesimple.googlecode.com/svn/trunk/WPF/ListItemDoubleClickDemo/">ListItemDoubleClickDemo</a></p> <div style="margin: 0px; padding: 0px; display: inline; float: none;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c6d58023-12da-44ea-b225-0cf0fdfe31eb" class="wlWriterSmartContent">Technorati Tag: <a rel="tag" href="http://technorati.com/tags/WPF">WPF</a>,<a rel="tag" href="http://technorati.com/tags/Windows+Presentation+Foundation">Windows Presentation Foundation</a></div><img src="http://blogs.ugidotnet.org/bmatte/aggbug/94831.aspx" width="1" height="1" /> Matteo Baglini http://blogs.ugidotnet.org/bmatte/archive/2008/10/22/wpf-intercettare-levento-mousedoubleclick-di-un-listboxitem.aspx Wed, 22 Oct 2008 22:27:00 GMT http://blogs.ugidotnet.org/bmatte/archive/2008/10/22/wpf-intercettare-levento-mousedoubleclick-di-un-listboxitem.aspx#feedback 1 http://blogs.ugidotnet.org/bmatte/comments/commentRss/94831.aspx http://blogs.ugidotnet.org/bmatte/services/trackbacks/94831.aspx XAML - differenze fra Silverlight e WPF .NET http://blogs.ugidotnet.org/bmatte/archive/2008/10/22/xaml-differenze-fra-silverlight-e-wpf.aspx <p>XAML è un linguaggio dichiarativo general-purpose, sviluppato da Microsoft e derivato dall’XML, atto alla rappresentazione di gerarchie di oggetti. Attualmente XAML è utilizzato in Silverlight, Windows Presentation Foundation (WPF) e Windows Workflow Foundation (WF), ognuno con il proprio parser e runtime. Sul sito MSDN possiamo trovare un <a target="_blank" href="http://msdn.microsoft.com/en-us/library/cc917841%28VS.95%29.aspx">articolo</a> che spiega le differenze fra il parser di Silverlight e quello di WPF.</p> <div style="margin: 0px; padding: 0px; display: inline; float: none;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:5b705c79-6ae2-4913-a657-8c68ee716b86" class="wlWriterEditableSmartContent">Technorati Tag: <a rel="tag" href="http://technorati.com/tags/Silverlight">Silverlight</a>,<a rel="tag" href="http://technorati.com/tags/WPF">WPF</a>,<a rel="tag" href="http://technorati.com/tags/Windows+Presentation+Foundation">Windows Presentation Foundation</a>,<a rel="tag" href="http://technorati.com/tags/XAML">XAML</a></div><img src="http://blogs.ugidotnet.org/bmatte/aggbug/94835.aspx" width="1" height="1" /> Matteo Baglini http://blogs.ugidotnet.org/bmatte/archive/2008/10/22/xaml-differenze-fra-silverlight-e-wpf.aspx Wed, 22 Oct 2008 22:14:00 GMT http://blogs.ugidotnet.org/bmatte/archive/2008/10/22/xaml-differenze-fra-silverlight-e-wpf.aspx#feedback 1 http://blogs.ugidotnet.org/bmatte/comments/commentRss/94835.aspx http://blogs.ugidotnet.org/bmatte/services/trackbacks/94835.aspx [WPF] RadioButton+Binding=BUG .NET http://blogs.ugidotnet.org/bmatte/archive/2008/10/20/wpf-radiobuttonbindingbug.aspx <p>Questo post doveva essere pubblicato già da po’ di settimane, ma gli impegni sono sempre pronti a mettere il bastone fra le ruote.</p> <p>In WPF se mettete in Binding una proprietà di tipo boolean con un controllo RadioButton vi accorgerete presto di un bug nel motore di Binding.</p> <p>Maggiori info su questo <a target="_blank" href="http://groups.google.it/group/microsoft.public.it.dotnet.csharp/browse_frm/thread/93620107bb52fead/91937a77dd19f7ec?tvc=1#91937a77dd19f7ec">thread sul newsgroup di C#</a>.</p> <p>Grazie a <a target="_blank" href="../../../../corrado">Corrado</a> per la segnalazione</p> <div style="margin: 0px; padding: 0px; display: inline; float: none;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e5e6233a-a132-4cda-8806-ba61169cece2" class="wlWriterEditableSmartContent">Technorati Tag: <a rel="tag" href="http://technorati.com/tags/Windows+Presentation+Foundation">Windows Presentation Foundation</a>,<a rel="tag" href="http://technorati.com/tags/WPF">WPF</a></div><img src="http://blogs.ugidotnet.org/bmatte/aggbug/94834.aspx" width="1" height="1" /> Matteo Baglini http://blogs.ugidotnet.org/bmatte/archive/2008/10/20/wpf-radiobuttonbindingbug.aspx Mon, 20 Oct 2008 22:22:00 GMT http://blogs.ugidotnet.org/bmatte/archive/2008/10/20/wpf-radiobuttonbindingbug.aspx#feedback 1 http://blogs.ugidotnet.org/bmatte/comments/commentRss/94834.aspx http://blogs.ugidotnet.org/bmatte/services/trackbacks/94834.aspx Expression Blend framework vs CompositeWPF framework .NET Architecture http://blogs.ugidotnet.org/bmatte/archive/2008/10/20/expression-blend-framework-vs-compositewpf-framework.aspx <p>Un interessante confronto tra il framework di una WPF Composite Application (<a target="_blank" href="http://www.microsoft.com/expression/products/Overview.aspx?key=blend">Expression Blend</a>) e un framework per creare WPF Composite Application (<a target="_blank" href="http://www.codeplex.com/CompositeWPF">CompositeWPF</a>).</p> <p>Fonte: <a target="_blank" href="http://www.paulstovell.com/blog/expression-framework-versus-composite-wpf">Expression Framework versus Composite WPF</a></p> <div style="margin: 0px; padding: 0px; display: inline; float: none;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:114d5c6c-4de7-4ce9-8df9-6ae7b3f4b9e6" class="wlWriterEditableSmartContent">Technorati Tag: <a rel="tag" href="http://technorati.com/tags/ExpressionBlend">ExpressionBlend</a>,<a rel="tag" href="http://technorati.com/tags/CompositeWPF">CompositeWPF</a>,<a rel="tag" href="http://technorati.com/tags/WPF">WPF</a>,<a rel="tag" href="http://technorati.com/tags/Windows+Presentation+Foundation">Windows Presentation Foundation</a></div><img src="http://blogs.ugidotnet.org/bmatte/aggbug/94833.aspx" width="1" height="1" /> Matteo Baglini http://blogs.ugidotnet.org/bmatte/archive/2008/10/20/expression-blend-framework-vs-compositewpf-framework.aspx Mon, 20 Oct 2008 21:51:00 GMT http://blogs.ugidotnet.org/bmatte/archive/2008/10/20/expression-blend-framework-vs-compositewpf-framework.aspx#feedback 1 http://blogs.ugidotnet.org/bmatte/comments/commentRss/94833.aspx http://blogs.ugidotnet.org/bmatte/services/trackbacks/94833.aspx Adesso ci siamo anche noi!! .NET Community http://blogs.ugidotnet.org/bmatte/archive/2008/10/20/adesso-ci-siamo-anche-noi.aspx <p>Non sono bravo a fare gli annunci formali quindi vado dritto al sodo, insieme ad un gruppo di <a target="_blank" href="http://dotnettoscana.org/content/About.aspx">amici</a> abbiamo dato vita allo <a target="_blank" href="http://dotnettoscana.org/">User Group Toscano su .NET</a>, il sito è ufficialmente online da Venerdì 10 Ottobre. Alcuni di <a target="_blank" href="http://dotnettoscana.org/forums/t/6.aspx">noi</a> erano presenti alla tappa Toscana dell’evento <a target="_blank" href="http://www.microsoft.com/italy/eventi/days/technical.mspx">Microsoft Days</a> dove <a target="_blank" href="http://blogs.msdn.com/pietrobr/">Pietro Brambati</a> ha accettato la nostra proposta di sfruttare l’occasione per presentare il neonato gruppo (con tanta insistenza da parte nostra non poteva rifiutare <img src="http://spaces.live.com/rte/emoticons/smile_wink.gif" alt="smile_wink" />). Pietro si è dimostrato molto disponibile ed alla fine ha fatto <a target="_blank" href="http://blogs.msdn.com/pietrobr/archive/2008/10/20/intervista-a-dotnettoscana-org.aspx">molto di più</a> di quello che abbiamo chiesto…<img src="http://spaces.live.com/rte/emoticons/smile_wink.gif" alt="smile_wink" /></p> <p>Sempre in quell’occasione ho avuto il piacere di conoscere <a target="_blank" href="http://blogs.msdn.com/gabrielecastellani/">Gabriele Castellani</a>, <a target="_blank" href="http://blogs.msdn.com/giuseppeguerrasio/">Giuseppe Guerrasio</a> e <a target="_blank" href="http://community.visual-basic.it/alessandro/">Alessandro Del Sole</a>, che ringrazio e saluto!</p> <p>Per finire un particolare grazie va a <a target="_blank" href="mailto:peolo_13@hotmail.it">Paolo Carpitelli</a>, una persona molto disponibile che, nonostante non abbia niente a che fare con il modo IT, ne tanto meno con quello delle communities, con pochissimo preavviso è stato in grado di fornirci un logo in tempo per l’evento di Giovedì, sopportando anche le nostre esigenze. Grazie Paolo!</p> <p> </p> <p>PS: mentre <a target="_blank" href="http://www.ugidotnet.org/">UGIdotNET</a> era off-line per i problemi che sappiamo, <a target="_blank" href="../../../../marcom/">Marco Minerva</a> era in totale astinenza da blogging, dato che ormai aveva perso tutti i capelli e non sopportava più quello stato di ansia e tensione <img src="http://spaces.live.com/rte/emoticons/smile_wink.gif" alt="smile_wink" /> ha iniziato a <a target="_blank" href="http://dotnettoscana.org/blogs/marco/">bloggare</a> sulla nostra community :D</p> <p> </p> <div style="margin: 0px; padding: 0px; display: inline; float: none;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a3b787af-c252-46bf-8631-f04e32b0a173" class="wlWriterEditableSmartContent">Technorati Tag: <a rel="tag" href="http://technorati.com/tags/DotNetToscana">DotNetToscana</a></div><img src="http://blogs.ugidotnet.org/bmatte/aggbug/94832.aspx" width="1" height="1" /> Matteo Baglini http://blogs.ugidotnet.org/bmatte/archive/2008/10/20/adesso-ci-siamo-anche-noi.aspx Mon, 20 Oct 2008 15:47:00 GMT http://blogs.ugidotnet.org/bmatte/archive/2008/10/20/adesso-ci-siamo-anche-noi.aspx#feedback http://blogs.ugidotnet.org/bmatte/comments/commentRss/94832.aspx http://blogs.ugidotnet.org/bmatte/services/trackbacks/94832.aspx [OT] 100 Pushups challenge OT http://blogs.ugidotnet.org/bmatte/archive/2008/08/29/ot-100-pushups-challenge---initial-test.aspx <p><a href="http://blogs.ugidotnet.org/piyo/archive/2008/08/28/100-pushups-challenge.aspx#1391456">Accettare</a> la <a href="http://blogs.ugidotnet.org/piyo/archive/2008/08/28/100-pushups-challenge.aspx">sfida</a> è stato facile <img alt="smile_teeth" src="http://spaces.live.com/rte/emoticons/smile_teeth.gif" />...però ora arriva la parte difficile, raggiungere l'obbiettivo!! <img alt="smile_confused" src="http://spaces.live.com/rte/emoticons/smile_confused.gif" /> </p> <p>La prima fase è un test iniziale nel quale ho fatto 25 flessioni di fila!! ( + 1 infarto <img alt="smile_wink" src="http://spaces.live.com/rte/emoticons/smile_wink.gif" />)</p> <div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:948f71a1-8343-4d8f-985d-bf09adfa29c4" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati Tag: <a href="http://technorati.com/tags/flessioni" rel="tag">flessioni</a>,<a href="http://technorati.com/tags/100pushups" rel="tag">100pushups</a></div><img src="http://blogs.ugidotnet.org/bmatte/aggbug/93868.aspx" width="1" height="1" /> Matteo Baglini http://blogs.ugidotnet.org/bmatte/archive/2008/08/29/ot-100-pushups-challenge---initial-test.aspx Fri, 29 Aug 2008 13:08:58 GMT http://blogs.ugidotnet.org/bmatte/archive/2008/08/29/ot-100-pushups-challenge---initial-test.aspx#feedback 7 http://blogs.ugidotnet.org/bmatte/comments/commentRss/93868.aspx http://blogs.ugidotnet.org/bmatte/services/trackbacks/93868.aspx