<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>.NET</title>
        <link>http://blogs.ugidotnet.org/bmatte/category/.NET.aspx</link>
        <description>.NET</description>
        <language>it-IT</language>
        <copyright>Matteo Baglini</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>Microsoft Community Tour: adesso tocca alla Toscana!</title>
            <link>http://blogs.ugidotnet.org/bmatte/archive/2010/01/07/microsoft-community-tour-adesso-tocca-alla-toscana.aspx</link>
            <description>&lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;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" /&gt; &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;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 &lt;a href="http://www.microsoft.com/italy/lancio09/community.aspx" target="_blank"&gt;Community Tour&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;L’evento è interamente dedicato allo &lt;strong&gt;Sviluppo Web&lt;/strong&gt;, se volete registrarvi o ricevere maggiori informazioni su sessioni e location, visitate l’apposita &lt;a href="http://dotnettoscana.org/content/MicrosoftCommunityTour2009.aspx" target="_blank"&gt;pagina dell’evento&lt;/a&gt; sul nostro sito.&lt;/p&gt;  &lt;p&gt;Vi aspettiamo!!&lt;/p&gt;  &lt;p&gt; &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:0767317B-992E-4b12-91E0-4F059A8CECA8:d0ebb833-689e-4208-a4f4-8243337cc910" class="wlWriterEditableSmartContent"&gt;Technorati Tag: &lt;a href="http://technorati.com/tags/Community+Tour" rel="tag"&gt;Community Tour&lt;/a&gt;,&lt;a href="http://technorati.com/tags/DotNetToscana" rel="tag"&gt;DotNetToscana&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Eventi" rel="tag"&gt;Eventi&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/bmatte/aggbug/97816.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matteo Baglini</dc:creator>
            <guid>http://blogs.ugidotnet.org/bmatte/archive/2010/01/07/microsoft-community-tour-adesso-tocca-alla-toscana.aspx</guid>
            <pubDate>Thu, 07 Jan 2010 17:43:28 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/bmatte/archive/2010/01/07/microsoft-community-tour-adesso-tocca-alla-toscana.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/bmatte/comments/commentRss/97816.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/bmatte/services/trackbacks/97816.aspx</trackback:ping>
        </item>
        <item>
            <title>WPF Functional Testing With White</title>
            <link>http://blogs.ugidotnet.org/bmatte/archive/2008/12/18/wpf-functional-testing-with-white.aspx</link>
            <description>&lt;p&gt;(@ &lt;a href="http://blogs.ugidotnet.org/dsantarelli" target="_blank"&gt;Dario&lt;/a&gt;: accetto la sfida!!! &lt;img alt="smile_teeth" src="http://spaces.live.com/rte/emoticons/smile_teeth.gif" /&gt; )&lt;/p&gt;  &lt;p&gt;Nel mio &lt;a href="http://blogs.ugidotnet.org/bmatte/archive/2008/12/16/wpf-ui-test-framework.aspx" target="_blank"&gt;ultimo post&lt;/a&gt; ho annunciato il rilascio di un framework per effettuare test funzionali per applicazioni desktop in maniera del tutto automatica. &lt;a href="http://blogs.ugidotnet.org/dsantarelli" target="_blank"&gt;Dario&lt;/a&gt; ha accettato la mia &lt;a href="http://blogs.ugidotnet.org/bmatte/archive/2008/12/16/wpf-ui-test-framework.aspx#1405390" target="_blank"&gt;richiesta&lt;/a&gt; rispondendo con un bel &lt;a href="http://blogs.ugidotnet.org/dsantarelli/archive/2008/12/17/testapi-e-input-injection.aspx" target="_blank"&gt;post su TestApi e Input Injection&lt;/a&gt;. Tutto ciò mi ha messo voglia di provare a rifare il solito test da lui proposto, però utilizzando &lt;a href="http://www.codeplex.com/white" target="_blank"&gt;white&lt;/a&gt;, così possiamo confrontare i due framework. Cominciamo!!&lt;/p&gt;  &lt;p&gt;Prima di tutto lo screenshot della mia applicazione, non è proprio identica a quella di Dario, ma va benissimo!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/bmatte/WindowsLiveWriter/UIFunctionalTestingWithWhite_12787/ui%20test_2.png" target="_blank"&gt;&lt;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" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Come sappiamo, lo scopo del test è quello di:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Lanciare l'applicazione &lt;/li&gt;    &lt;li&gt;Selezione della modalità di filtraggio (ovvero selezione di un item della ComboBox) &lt;/li&gt;    &lt;li&gt;Inserimento della filterExpression (typing nella TextBox) &lt;/li&gt;    &lt;li&gt;Click del Button di ricerca &lt;/li&gt;    &lt;li&gt;Valutazione dei risultati nella ListBox &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Niente di più facile!! &lt;img alt="smile_wink" src="http://spaces.live.com/rte/emoticons/smile_wink.gif" /&gt; Come per le &lt;a href="http://www.codeplex.com/TestApi" target="_blank"&gt;TestApi&lt;/a&gt;, per prima cosa nello XAML dobbiamo impostare per ogni elemento interessato l’Attached Properties &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.automation.automationproperties.automationid.aspx" target="_blank"&gt;AutomationProperties.AutomationId&lt;/a&gt;, 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 &lt;a href="http://www.codeplex.com/white" target="_blank"&gt;white&lt;/a&gt; però in realtà fa parte del framework &lt;a href="http://www.nunit.org/" target="_blank"&gt;NUnit&lt;/a&gt;. Adesso non ci resta che aggiungere una nuava classe e scrivere il metodo di test come mostrato nel seguente snippet:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;[TestFixture]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MainWindowTests&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; path = &lt;span class="str"&gt;@"C:\…\WhiteDemoWithWpf.exe"&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    [Test]&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; When_click_search_should_filter_loaded_data_by_selected_mode_and_typed_expression()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        &lt;span class="kwrd"&gt;string&lt;/span&gt; productNameToMatch = &lt;span class="str"&gt;"Chang"&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        &lt;span class="rem"&gt;//Esecuzione dell'applicazione&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        var application = Application.Launch(path);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        &lt;span class="rem"&gt;//Ottengo la Window e verifico che non sia Null&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        var window = application.GetWindow(&lt;span class="str"&gt;"MainWindow"&lt;/span&gt;, InitializeOption.NoCache);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        Assert.That(window,Is.Not.Null);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;        &lt;span class="rem"&gt;//Seleziono un elemento della ComboBox&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        var lstFilterCriteria = window.Get&amp;lt;ComboBox&amp;gt;(&lt;span class="str"&gt;"lstFilterCriteria"&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        lstFilterCriteria.Select(3);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        &lt;span class="rem"&gt;//Scrivo il Product Name per il test&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;        var txtProductName = window.Get&amp;lt;TextBox&amp;gt;(&lt;span class="str"&gt;"txtProductName"&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;        txtProductName.Text = productNameToMatch;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;        &lt;span class="rem"&gt;//Clicco il Button per effettuare la ricerca&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;        var btnFilterProducts = window.Get&amp;lt;Button&amp;gt;(&lt;span class="str"&gt;"btnFilterProducts"&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;        btnFilterProducts.Click();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;        &lt;span class="rem"&gt;//Verifico che il numero totale di elementi della lista sia 1&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;        var listViewProducts = window.Get&amp;lt;ListView&amp;gt;(&lt;span class="str"&gt;"listViewProducts"&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;        Assert.That(listViewProducts.Rows.Count, Is.EqualTo(1));&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;        &lt;span class="rem"&gt;//Verifico il contenuto della cella contenente &lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;        &lt;span class="rem"&gt;//il risultato della ricerca con il Product Name per il test&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;        var cell = listViewProducts.Rows[0].Cells[0];&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;        Assert.That(cell.Text, Is.EqualTo(productNameToMatch));&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;        &lt;span class="rem"&gt;//Chiudo l'applicazione&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;        application.Kill();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![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; }]]&gt;&lt;/style&gt;

&lt;p&gt;I commenti descrivono chiaramente la logica del metodo. Lanciamo il test (sempre con le mani dietro alla testa &lt;img alt="smile_wink" src="http://spaces.live.com/rte/emoticons/smile_wink.gif" /&gt;) e godiamoci il risultato:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/bmatte/WindowsLiveWriter/UIFunctionalTestingWithWhite_12787/CropperCapture%5B1%5D.png" target="_blank"&gt;&lt;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" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p /&gt;

&lt;p&gt;Le prime tre righe sono “problemi” di &lt;a href="http://www.codeplex.com/white/Wiki/View.aspx?title=Configuration&amp;amp;referringTitle=Home" target="_blank"&gt;confgurazione&lt;/a&gt; non essenziali per questa demo. &lt;/p&gt;

&lt;p&gt;Confrontando il solito metodo di test scritto con i due framework devo dire che &lt;a href="http://www.codeplex.com/white" target="_blank"&gt;white&lt;/a&gt; al momento offre un modello di pilotaggio della UI molto più ricco e semplice da utilizzare. Atro aspetto interessante è che &lt;a href="http://www.codeplex.com/white" target="_blank"&gt;white&lt;/a&gt; permette di testare anche applicazioni Java scritte in SWT!!&lt;/p&gt;

&lt;p&gt;Devo ammettere che vedere l’applicazione vivere di vita propria fa un certo effetto!!! &lt;img alt="smile_teeth" src="http://spaces.live.com/rte/emoticons/smile_teeth.gif" /&gt;&lt;/p&gt;

&lt;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"&gt;Technorati Tag: &lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Windows+Presentation+Foundation" rel="tag"&gt;Windows Presentation Foundation&lt;/a&gt;,&lt;a href="http://technorati.com/tags/FunctionalTest" rel="tag"&gt;FunctionalTest&lt;/a&gt;,&lt;a href="http://technorati.com/tags/White" rel="tag"&gt;White&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/bmatte/aggbug/94978.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matteo Baglini</dc:creator>
            <guid>http://blogs.ugidotnet.org/bmatte/archive/2008/12/18/wpf-functional-testing-with-white.aspx</guid>
            <pubDate>Thu, 18 Dec 2008 23:23:02 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/bmatte/archive/2008/12/18/wpf-functional-testing-with-white.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/bmatte/comments/commentRss/94978.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/bmatte/services/trackbacks/94978.aspx</trackback:ping>
        </item>
        <item>
            <title>WPF UI Test Framework</title>
            <link>http://blogs.ugidotnet.org/bmatte/archive/2008/12/16/wpf-ui-test-framework.aspx</link>
            <description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/ivo_manolov/archive/2008/12/06/9181396.aspx" target="_blank"&gt;Ivo Manolov annumcia&lt;/a&gt; sul proprio blog il &lt;a href="http://www.codeplex.com/TestApi" target="_blank"&gt;rilascio di un tool open source&lt;/a&gt; per automatizzare il test della UI sia essa in WPF pittosto che WinForm. Sempre sul suo blog potete leggere il &lt;a href="http://blogs.msdn.com/ivo_manolov/archive/2008/12/15/9223397.aspx" target="_blank"&gt;primo post guida&lt;/a&gt; del tool. Da questi post ho scoperto che esiste un &lt;a href="http://blogs.msdn.com/wpftesting/" target="_blank"&gt;blog su MSDN dedicato al testing di WPF&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Esisteva già un tool open surce simile si chiama &lt;a href="http://www.codeplex.com/white" target="_blank"&gt;white ed anche questo è hostato su CodePlex&lt;/a&gt;.&lt;/p&gt;  &lt;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"&gt;Technorati Tag: &lt;a href="http://technorati.com/tags/UnitTest" rel="tag"&gt;UnitTest&lt;/a&gt;,&lt;a href="http://technorati.com/tags/UI+Test" rel="tag"&gt;UI Test&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/bmatte/aggbug/94957.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matteo Baglini</dc:creator>
            <guid>http://blogs.ugidotnet.org/bmatte/archive/2008/12/16/wpf-ui-test-framework.aspx</guid>
            <pubDate>Tue, 16 Dec 2008 17:02:24 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/bmatte/archive/2008/12/16/wpf-ui-test-framework.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/bmatte/comments/commentRss/94957.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/bmatte/services/trackbacks/94957.aspx</trackback:ping>
        </item>
        <item>
            <title>Pattern Model-View-ViewModel, INotifyPropertyChanged, Static Reflection e Extension methods</title>
            <link>http://blogs.ugidotnet.org/bmatte/archive/2008/11/28/pattern-model-view-viewmodel-inotifypropertychanged-static-reflection-e-extension-methods.aspx</link>
            <description>&lt;p&gt;Anch’io nei miei progetti WPF per rendere testabile la logica della mia applicazione senza rinunciare alla pontenza del &lt;em&gt;DataBinding&lt;/em&gt; utilizzo (anche) il Pattern Model-View-ViewModel. L’interfaccia &lt;em&gt;INotifyPropertyChanged&lt;/em&gt; 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:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Person : INotifyPropertyChanged {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; PropertyChangedEventHandler PropertyChanged;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;  &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; firstName = String.Empty;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; FirstName {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    get { &lt;span class="kwrd"&gt;return&lt;/span&gt; firstName; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    set {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt; (firstName != &lt;span class="kwrd"&gt;value&lt;/span&gt;) {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        firstName = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        RaisePropertyChanged(&lt;span class="str"&gt;"FirstName"&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;      }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;  }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;  &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; RaisePropertyChanged(&lt;span class="kwrd"&gt;string&lt;/span&gt; propertyName) {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (PropertyChanged != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;      PropertyChanged(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; PropertyChangedEventArgs(propertyName));&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;  }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p /&gt;
&lt;style type="text/css"&gt;&lt;![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; }]]&gt;&lt;/style&gt;

&lt;p /&gt;

&lt;p&gt;Se cambio il nome della proprietà &lt;em&gt;FirstName&lt;/em&gt; Visual Studio si accorge del cambiamento e mi permette con un solo click di rinominare la proprietà ovunque venga utilizzata, però questo sistema di &lt;em&gt;refactoring&lt;/em&gt; non è abbastanza &lt;em&gt;smart&lt;/em&gt; da modificare la stringa &lt;em&gt;FirstName&lt;/em&gt; (riga 10). Grazie alla &lt;a href="http://ayende.com/Blog/archive/2005/10/29/StaticReflection.aspx" target="_blank"&gt;Static Reflection&lt;/a&gt; possiamo eliminare questo problema, il “trucco” sta nel passare al metodo &lt;em&gt;RaisePropertyChanged&lt;/em&gt; la proprietà come tipo &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb335710.aspx" target="_blank"&gt;Expression&amp;lt;Func&amp;lt;T&amp;gt;&amp;gt;&lt;/a&gt;,&lt;/em&gt; convertire successivamente il &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.linq.expressions.lambdaexpression.body.aspx" target="_blank"&gt;Body&lt;/a&gt;&lt;/em&gt; nel tipo &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.linq.expressions.memberexpression.aspx" target="_blank"&gt;MemberExpression&lt;/a&gt;&lt;/em&gt; ed in fine recuperare il nome tramite le proprietà &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.linq.expressions.memberexpression.member.aspx" target="_blank"&gt;Member&lt;/a&gt;&lt;/em&gt;. Risultato:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Person : INotifyPropertyChanged {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; PropertyChangedEventHandler PropertyChanged;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;  &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; firstName = String.Empty;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; FirstName {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    get { &lt;span class="kwrd"&gt;return&lt;/span&gt; firstName; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    set {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt; (firstName != &lt;span class="kwrd"&gt;value&lt;/span&gt;) {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        firstName = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        RaisePropertyChanged(() =&amp;gt; FirstName);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;      }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;  }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;  &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; RaisePropertyChanged&amp;lt;T&amp;gt;(Expression&amp;lt;Func&amp;lt;T&amp;gt;&amp;gt; property) {  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    var expression = property.Body &lt;span class="kwrd"&gt;as&lt;/span&gt; MemberExpression;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    var member = expression.Member;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (PropertyChanged != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;      PropertyChanged(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; PropertyChangedEventArgs(member.Name));&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;  }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p /&gt;&lt;style type="text/css"&gt;&lt;![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; }]]&gt;&lt;/style&gt;Adesso il nostro codice supporta pienamente il &lt;em&gt;rename refactoring&lt;/em&gt;. Come ultimo passo possiamo incapsulare la logica di manipolazione dei tipi &lt;em&gt;Expression&lt;/em&gt; in un &lt;em&gt;Extension methods &lt;/em&gt;rendendo il codice molto più leggibile:

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; PropertyExtensions {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; PropertyChangedEventArgs CreateChangeEventArgs&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; Expression&amp;lt;Func&amp;lt;T&amp;gt;&amp;gt; property) {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    var expression = property.Body &lt;span class="kwrd"&gt;as&lt;/span&gt; MemberExpression;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    var member = expression.Member;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; PropertyChangedEventArgs(member.Name);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;  }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;}&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Person : INotifyPropertyChanged {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; PropertyChangedEventHandler PropertyChanged;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;  &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; firstName = String.Empty;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; FirstName {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    get { &lt;span class="kwrd"&gt;return&lt;/span&gt; firstName; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    set {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt; (firstName != &lt;span class="kwrd"&gt;value&lt;/span&gt;) {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        firstName = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;        RaisePropertyChanged(() =&amp;gt; FirstName);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;      }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;  }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;  &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; RaisePropertyChanged&amp;lt;T&amp;gt;(Expression&amp;lt;Func&amp;lt;T&amp;gt;&amp;gt; property) {  &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (PropertyChanged != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;      PropertyChanged(&lt;span class="kwrd"&gt;this&lt;/span&gt;, property.CreateChangeEventArgs());&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;  }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p /&gt;

&lt;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"&gt;Technorati Tag: &lt;a href="http://technorati.com/tags/Model-View-ViewModel" rel="tag"&gt;Model-View-ViewModel&lt;/a&gt;,&lt;a href="http://technorati.com/tags/M-V-VM" rel="tag"&gt;M-V-VM&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Extension+Methods" rel="tag"&gt;Extension Methods&lt;/a&gt;,&lt;a href="http://technorati.com/tags/INotifyPropertyChanged" rel="tag"&gt;INotifyPropertyChanged&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Expression" rel="tag"&gt;Expression&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/bmatte/aggbug/94787.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matteo Baglini</dc:creator>
            <guid>http://blogs.ugidotnet.org/bmatte/archive/2008/11/28/pattern-model-view-viewmodel-inotifypropertychanged-static-reflection-e-extension-methods.aspx</guid>
            <pubDate>Fri, 28 Nov 2008 16:06:28 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/bmatte/archive/2008/11/28/pattern-model-view-viewmodel-inotifypropertychanged-static-reflection-e-extension-methods.aspx#feedback</comments>
            <slash:comments>13</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/bmatte/comments/commentRss/94787.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/bmatte/services/trackbacks/94787.aspx</trackback:ping>
        </item>
        <item>
            <title>WPF Effects Library</title>
            <link>http://blogs.ugidotnet.org/bmatte/archive/2008/10/23/wpf-effects-library.aspx</link>
            <description>Una delle &lt;a target="_blank" href="http://windowsclient.net/wpf/wpf35/wpf-whats-new-35sp1.aspx"&gt;novità di WPF 3.5 SP1&lt;/a&gt; sono gli Shader Effects, adesso il Team di WPF ha pubblicato su &lt;a target="_blank" href="http://www.codeplex.com/"&gt;CodePlex&lt;/a&gt; la &lt;a target="_blank" href="http://www.codeplex.com/wpffx"&gt;Windows Presentation Foundation Pixel Shader Effects Library&lt;/a&gt;, una libreria  contenente molti Shader Effects, direttamente dalla home del progetto:
&lt;p&gt;Initial seed includes:      &lt;br /&gt;
Effects:       &lt;br /&gt;
BandedSwirl, Bloom, BrightExtract, ColorKeyAlpha, ColorTone, ContrastAdjust, DirectionalBlur, Embossed, Gloom, GrowablePoissonDiskEffect, InvertColor, LightStreak, Magnify, Monochrome, Pinch, Pixelate, Ripple, Sharpen, SmoothMagnify, Swirl, Tone, Toon, and ZoomBlur &lt;br /&gt;
Transition Effects:       &lt;br /&gt;
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. &lt;/p&gt;
&lt;p&gt;Ora non resta che provarli tutti &lt;img src="http://spaces.live.com/rte/emoticons/smile_teeth.gif" alt="smile_teeth" /&gt;.&lt;/p&gt;
&lt;div style="margin: 0px; padding: 0px; display: inline; float: none;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:444a6ae9-6664-415d-8b8a-b0d9cb107bfb" class="wlWriterEditableSmartContent"&gt;Technorati Tag: &lt;a rel="tag" href="http://technorati.com/tags/WPF"&gt;WPF&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Windows+Presentation+Foundation"&gt;Windows Presentation Foundation&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Shader+Effects"&gt;Shader Effects&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/bmatte/aggbug/94837.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matteo Baglini</dc:creator>
            <guid>http://blogs.ugidotnet.org/bmatte/archive/2008/10/23/wpf-effects-library.aspx</guid>
            <pubDate>Thu, 23 Oct 2008 10:47:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/bmatte/archive/2008/10/23/wpf-effects-library.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/bmatte/comments/commentRss/94837.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/bmatte/services/trackbacks/94837.aspx</trackback:ping>
        </item>
        <item>
            <title>Pubblicati i sorgenti del controllo WatermarkedTextBox</title>
            <link>http://blogs.ugidotnet.org/bmatte/archive/2008/10/22/pubblicati-i-sorgenti-del-controllo-watermarkedtextbox.aspx</link>
            <description>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.
&lt;ul&gt;
    &lt;li&gt;Sorgenti: &lt;a href="http://s3.amazonaws.com/timheuer-img/WatermarkedTextBox-Source.zip"&gt;WatermarkedTextBox-Source.zip&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;Binari: &lt;a href="http://s3.amazonaws.com/timheuer-img/WatermarkedTextBox-Binary.zip"&gt;WatermarkedTextBox-Binary.zip&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Fonte: &lt;a href="http://timheuer.com/blog/archive/2008/10/22/silverlight-watermark-text-box-control.aspx" target="_blank"&gt;Silverlight 2 Watermarked TextBox Control&lt;/a&gt;&lt;/p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e686344b-7a42-45bd-8696-9b52f54809db" style="margin: 0px; padding: 0px; display: inline; float: none;"&gt;Technorati Tag: &lt;a href="http://technorati.com/tags/Silverlight" rel="tag"&gt;Silverlight&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/bmatte/aggbug/94836.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matteo Baglini</dc:creator>
            <guid>http://blogs.ugidotnet.org/bmatte/archive/2008/10/22/pubblicati-i-sorgenti-del-controllo-watermarkedtextbox.aspx</guid>
            <pubDate>Wed, 22 Oct 2008 22:27:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/bmatte/archive/2008/10/22/pubblicati-i-sorgenti-del-controllo-watermarkedtextbox.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/bmatte/comments/commentRss/94836.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/bmatte/services/trackbacks/94836.aspx</trackback:ping>
        </item>
        <item>
            <title>[WPF] Intercettare l’evento MouseDoubleClick di un ListBoxItem</title>
            <link>http://blogs.ugidotnet.org/bmatte/archive/2008/10/22/wpf-intercettare-levento-mousedoubleclick-di-un-listboxitem.aspx</link>
            <description>&lt;p&gt;Visual Studio 2008 Sp1 non visualizza l’evento MouseDoubleClick per un ListBoxITem, come se non esistesse:&lt;/p&gt;
&lt;p&gt; &lt;a href="../../../../images/blogs_ugidotnet_org/bmatte/WindowsLiveWriter/a560dea00ac4_11015/ListBoxITemMouseDoubleClick_2.png"&gt;&lt;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" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;In realtà tale evento esiste, è solo un problema di IntelliSense, quindi basta digitare il nome e tutto funziona:&lt;/p&gt;
&lt;p&gt; &lt;a href="../../../../images/blogs_ugidotnet_org/bmatte/WindowsLiveWriter/a560dea00ac4_11015/ListBoxITemMouseDoubleClick2_2.png"&gt;&lt;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" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Al seguente url è disponibile una piccola demo: &lt;a target="_blank" href="http://makesimple.googlecode.com/svn/trunk/WPF/ListItemDoubleClickDemo/"&gt;ListItemDoubleClickDemo&lt;/a&gt;&lt;/p&gt;
&lt;div style="margin: 0px; padding: 0px; display: inline; float: none;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c6d58023-12da-44ea-b225-0cf0fdfe31eb" class="wlWriterSmartContent"&gt;Technorati Tag: &lt;a rel="tag" href="http://technorati.com/tags/WPF"&gt;WPF&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Windows+Presentation+Foundation"&gt;Windows Presentation Foundation&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/bmatte/aggbug/94831.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matteo Baglini</dc:creator>
            <guid>http://blogs.ugidotnet.org/bmatte/archive/2008/10/22/wpf-intercettare-levento-mousedoubleclick-di-un-listboxitem.aspx</guid>
            <pubDate>Wed, 22 Oct 2008 22:27:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/bmatte/archive/2008/10/22/wpf-intercettare-levento-mousedoubleclick-di-un-listboxitem.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/bmatte/comments/commentRss/94831.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/bmatte/services/trackbacks/94831.aspx</trackback:ping>
        </item>
        <item>
            <title>XAML - differenze fra Silverlight e WPF</title>
            <link>http://blogs.ugidotnet.org/bmatte/archive/2008/10/22/xaml-differenze-fra-silverlight-e-wpf.aspx</link>
            <description>&lt;p&gt;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 &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/cc917841%28VS.95%29.aspx"&gt;articolo&lt;/a&gt; che spiega le differenze fra il parser di Silverlight e quello di WPF.&lt;/p&gt;
&lt;div style="margin: 0px; padding: 0px; display: inline; float: none;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:5b705c79-6ae2-4913-a657-8c68ee716b86" class="wlWriterEditableSmartContent"&gt;Technorati Tag: &lt;a rel="tag" href="http://technorati.com/tags/Silverlight"&gt;Silverlight&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/WPF"&gt;WPF&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Windows+Presentation+Foundation"&gt;Windows Presentation Foundation&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/XAML"&gt;XAML&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/bmatte/aggbug/94835.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matteo Baglini</dc:creator>
            <guid>http://blogs.ugidotnet.org/bmatte/archive/2008/10/22/xaml-differenze-fra-silverlight-e-wpf.aspx</guid>
            <pubDate>Wed, 22 Oct 2008 22:14:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/bmatte/archive/2008/10/22/xaml-differenze-fra-silverlight-e-wpf.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/bmatte/comments/commentRss/94835.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/bmatte/services/trackbacks/94835.aspx</trackback:ping>
        </item>
        <item>
            <title>[WPF] RadioButton+Binding=BUG</title>
            <link>http://blogs.ugidotnet.org/bmatte/archive/2008/10/20/wpf-radiobuttonbindingbug.aspx</link>
            <description>&lt;p&gt;Questo post doveva essere pubblicato già da po’ di settimane, ma gli impegni sono sempre pronti a mettere il bastone fra le ruote.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Maggiori info su questo &lt;a target="_blank" href="http://groups.google.it/group/microsoft.public.it.dotnet.csharp/browse_frm/thread/93620107bb52fead/91937a77dd19f7ec?tvc=1#91937a77dd19f7ec"&gt;thread sul newsgroup di C#&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Grazie a &lt;a target="_blank" href="../../../../corrado"&gt;Corrado&lt;/a&gt; per la segnalazione&lt;/p&gt;
&lt;div style="margin: 0px; padding: 0px; display: inline; float: none;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e5e6233a-a132-4cda-8806-ba61169cece2" class="wlWriterEditableSmartContent"&gt;Technorati Tag: &lt;a rel="tag" href="http://technorati.com/tags/Windows+Presentation+Foundation"&gt;Windows Presentation Foundation&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/WPF"&gt;WPF&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/bmatte/aggbug/94834.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matteo Baglini</dc:creator>
            <guid>http://blogs.ugidotnet.org/bmatte/archive/2008/10/20/wpf-radiobuttonbindingbug.aspx</guid>
            <pubDate>Mon, 20 Oct 2008 22:22:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/bmatte/archive/2008/10/20/wpf-radiobuttonbindingbug.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/bmatte/comments/commentRss/94834.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/bmatte/services/trackbacks/94834.aspx</trackback:ping>
        </item>
        <item>
            <title>Expression Blend framework vs CompositeWPF framework</title>
            <link>http://blogs.ugidotnet.org/bmatte/archive/2008/10/20/expression-blend-framework-vs-compositewpf-framework.aspx</link>
            <description>&lt;p&gt;Un interessante confronto tra il framework di una WPF Composite Application (&lt;a target="_blank" href="http://www.microsoft.com/expression/products/Overview.aspx?key=blend"&gt;Expression Blend&lt;/a&gt;) e un framework per creare WPF Composite Application (&lt;a target="_blank" href="http://www.codeplex.com/CompositeWPF"&gt;CompositeWPF&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Fonte: &lt;a target="_blank" href="http://www.paulstovell.com/blog/expression-framework-versus-composite-wpf"&gt;Expression Framework versus Composite WPF&lt;/a&gt;&lt;/p&gt;
&lt;div style="margin: 0px; padding: 0px; display: inline; float: none;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:114d5c6c-4de7-4ce9-8df9-6ae7b3f4b9e6" class="wlWriterEditableSmartContent"&gt;Technorati Tag: &lt;a rel="tag" href="http://technorati.com/tags/ExpressionBlend"&gt;ExpressionBlend&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/CompositeWPF"&gt;CompositeWPF&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/WPF"&gt;WPF&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Windows+Presentation+Foundation"&gt;Windows Presentation Foundation&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/bmatte/aggbug/94833.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matteo Baglini</dc:creator>
            <guid>http://blogs.ugidotnet.org/bmatte/archive/2008/10/20/expression-blend-framework-vs-compositewpf-framework.aspx</guid>
            <pubDate>Mon, 20 Oct 2008 21:51:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/bmatte/archive/2008/10/20/expression-blend-framework-vs-compositewpf-framework.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/bmatte/comments/commentRss/94833.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/bmatte/services/trackbacks/94833.aspx</trackback:ping>
        </item>
    </channel>
</rss>