<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;D08MR38_eyp7ImA9WhVXGE8.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048</id><updated>2012-04-19T04:58:06.143-04:00</updated><category term="VSLive" /><category term="LINQ" /><category term="Vista" /><category term="Thin Client" /><category term="VMWare" /><category term="Architecture" /><category term="Smart Client" /><category term="NCover" /><category term="SQL Server" /><category term=".Net" /><category term="Cincinnati .Net Users Group" /><category term="RedGate" /><category term="Cincinnati SQL Server Users Group" /><category term="RhinoMocks" /><category term="SQLCompare" /><category term="VS2008" /><category term="XAML" /><category term="Blogging" /><category term="C#" /><category term="CodeMash" /><category term="NDepend" /><category term="JQuery" /><category term="Web Development" /><category term="ReSharper" /><category term="Help Files" /><category term="TDD" /><category term="Agile" /><category term="Index" /><category term="MbUnit" /><category term="CHM" /><category term="Gallio" /><category term="Scrum" /><category term="NHibernate" /><category term="Dayton .Net Users Group" /><category term="CodeStock" /><category term="R#" /><category term="New Features" /><category term="VisualSVN" /><category term="JSSpec" /><category term="WPF" /><category term="Unit Testing" /><category term="Speaking" /><category term="SQLDoc" /><title>.Net Musings</title><subtitle type="html">Wandering thoughts of a C# developer, architect, and trainer</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://japikse.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>90</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/japikse" /><feedburner:info uri="japikse" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by/2.0/" /><entry gd:etag="W/&quot;AkcFRHwyeyp7ImA9WxNRE04.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-5098572635083574570</id><published>2009-09-07T11:36:00.002-04:00</published><updated>2009-09-07T11:40:15.293-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-07T11:40:15.293-04:00</app:edited><title>This blog has moved (Finally)!</title><content type="html">I finally did it.  I set up my own hosted site using .NET Blog Engine. The new site is http://www.skimedic.com/blog.&lt;br /&gt;&lt;br /&gt;All of my previous posts have been moved, and I have a new feed burner link: http://feeds.feedburner.com/skimedic&lt;br /&gt;&lt;br /&gt;Why did I move?  For control.  I wanted to have separate pages hosting abstracts, sample code, etc, and I didn't want to have to maintain separate web sites.&lt;br /&gt;&lt;br /&gt;Why skimedic.com?  Well, japikse.com was taken (by a cousin of mine), and nobody can spell my name anyway. :-)&lt;br /&gt;&lt;br /&gt;So, look for all of these posts over at the new home, and lots more goodness to come! :-)&lt;br /&gt;&lt;br /&gt;As always, &lt;br /&gt;&lt;br /&gt;Happy Coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-5098572635083574570?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pWmVNGXJkw21IY09whV4Hq5rwy8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pWmVNGXJkw21IY09whV4Hq5rwy8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pWmVNGXJkw21IY09whV4Hq5rwy8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pWmVNGXJkw21IY09whV4Hq5rwy8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=mF2FB3aKgv8:FynR0P8uMZE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=mF2FB3aKgv8:FynR0P8uMZE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=mF2FB3aKgv8:FynR0P8uMZE:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=mF2FB3aKgv8:FynR0P8uMZE:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=mF2FB3aKgv8:FynR0P8uMZE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=mF2FB3aKgv8:FynR0P8uMZE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=mF2FB3aKgv8:FynR0P8uMZE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=mF2FB3aKgv8:FynR0P8uMZE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=mF2FB3aKgv8:FynR0P8uMZE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=mF2FB3aKgv8:FynR0P8uMZE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=mF2FB3aKgv8:FynR0P8uMZE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=mF2FB3aKgv8:FynR0P8uMZE:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/mF2FB3aKgv8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/5098572635083574570/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/09/this-blog-has-moved-finally.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/5098572635083574570?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/5098572635083574570?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/mF2FB3aKgv8/this-blog-has-moved-finally.html" title="This blog has moved (Finally)!" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/09/this-blog-has-moved-finally.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEANSHs-fSp7ImA9WxJbFk4.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-2475467457138821115</id><published>2009-07-26T14:26:00.001-04:00</published><updated>2009-07-26T14:26:39.555-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-26T14:26:39.555-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WPF" /><category scheme="http://www.blogger.com/atom/ns#" term="Smart Client" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><title>Multi-value Error Conditions with IDataErrorInfo</title><content type="html">&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:bd7e700c-3aa5-488b-b70a-43ed0010543e" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Visual+Studio+2008" rel="tag"&gt;Visual Studio 2008&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Smart+Client" rel="tag"&gt;Smart Client&lt;/a&gt;&lt;/div&gt; &lt;p&gt;In my &lt;a href="http://japikse.blogspot.com/2009/07/idataerrorinfo-error-templates-and-wpf.html" target="_blank"&gt;last post on IDataErrorInfo&lt;/a&gt;, we implemented the interface and created a custom template for showing the errors.&amp;nbsp; That works very well for single-valued error checking.&amp;nbsp; But what if the business logic is conditional (if Field A = x, Field B must be &amp;gt;= y)?&amp;nbsp; That implementation falls down.&amp;nbsp; The reason is that WPF only checks the error condition when the PropertyChanged event fires.&amp;nbsp; The solution is very simple, but does potentially come with a cost.&lt;/p&gt; &lt;p&gt;To illustrate this, we need to update our Product class to include a SalePrice property:&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;decimal&lt;/span&gt; _salePrice;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;decimal&lt;/span&gt; SalePrice&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _salePrice; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (_salePrice == &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        _salePrice = &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        onPropertyChanged(FieldNames.SalePrice);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;The business (albeit the one in my head :-)) has decided if the inventory gets to be over 50 units, then the item must be marked down 10%, but if the count &amp;lt; 50, it should not be marked down at all.&amp;nbsp; So the following code is introduced to enforce this rule:&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;case&lt;/span&gt; FieldNames.SalePrice:&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (Inventory &amp;gt; 50 &amp;amp;&amp;amp; SalePrice &amp;gt; (Price*.9M))&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ModelName + "&lt;span style="color: #8b0000"&gt; must be marked down due to stock quantity greater than 50&lt;/span&gt;";&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (Inventory &amp;lt; 50 &amp;amp;&amp;amp; SalePrice != Price)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ModelName + "&lt;span style="color: #8b0000"&gt; must not be marked down if the quantity is less than 50&lt;/span&gt;";&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;When we run the form and update the Inventory to 51, we don’t get any error indication unless we also update the Sale Price.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_byyhrRXCSAk/Smyf2RQcTXI/AAAAAAAAAGo/3Caqe27By4c/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_byyhrRXCSAk/Smyf23Vp7hI/AAAAAAAAAGs/bbdiiZ03-dg/image_thumb%5B1%5D.png?imgmax=800" width="442" height="410"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;We need the PropertyChanged event to fire for the SalePrice property.&amp;nbsp; But, if we were to add a line in the Inventory and/or Price validations to raise the event, we could end up with an infinite loop as they refer back to each other.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Fortunately, the solution is simple.&amp;nbsp; If we raise the event &lt;em&gt;without&lt;/em&gt; a property name in the even arguments, WPF will check &lt;em&gt;all&lt;/em&gt; of the properties to see if they have changed.&amp;nbsp; The cost here is that a lot of potentially needless checking is occurring, so you will have to make a decision if this solution works for you (we will explore other options in future posts).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Change the event raiser so that string.empty is passed into the even arguments, and the form works as expected.&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; onPropertyChanged(Enum fieldName)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (PropertyChanged != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        PropertyChanged(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; PropertyChangedEventArgs(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Empty));&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_byyhrRXCSAk/Smyf3E5XrNI/AAAAAAAAAGw/HYdt7OJxFWY/s1600-h/image%5B9%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_byyhrRXCSAk/Smyf3mMpESI/AAAAAAAAAG0/3-WRmin0l2Q/image_thumb%5B5%5D.png?imgmax=800" width="444" height="348"&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Happy Coding!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-2475467457138821115?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/gQExnqtbLb72PZZ8_u9_VTuYxxc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gQExnqtbLb72PZZ8_u9_VTuYxxc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/gQExnqtbLb72PZZ8_u9_VTuYxxc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gQExnqtbLb72PZZ8_u9_VTuYxxc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=CXRJO8IdDcU:kFlDGloAYvA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=CXRJO8IdDcU:kFlDGloAYvA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=CXRJO8IdDcU:kFlDGloAYvA:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=CXRJO8IdDcU:kFlDGloAYvA:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=CXRJO8IdDcU:kFlDGloAYvA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=CXRJO8IdDcU:kFlDGloAYvA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=CXRJO8IdDcU:kFlDGloAYvA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=CXRJO8IdDcU:kFlDGloAYvA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=CXRJO8IdDcU:kFlDGloAYvA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=CXRJO8IdDcU:kFlDGloAYvA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=CXRJO8IdDcU:kFlDGloAYvA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=CXRJO8IdDcU:kFlDGloAYvA:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/CXRJO8IdDcU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/2475467457138821115/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/07/multi-value-error-conditions-with.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/2475467457138821115?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/2475467457138821115?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/CXRJO8IdDcU/multi-value-error-conditions-with.html" title="Multi-value Error Conditions with IDataErrorInfo" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_byyhrRXCSAk/Smyf23Vp7hI/AAAAAAAAAGs/bbdiiZ03-dg/s72-c/image_thumb%5B1%5D.png?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/07/multi-value-error-conditions-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4BQH8ycSp7ImA9WxJbFk4.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-4019753671375816709</id><published>2009-07-15T17:10:00.001-04:00</published><updated>2009-07-26T14:29:11.199-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-26T14:29:11.199-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WPF" /><category scheme="http://www.blogger.com/atom/ns#" term="Smart Client" /><category scheme="http://www.blogger.com/atom/ns#" term="XAML" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><title>IDataErrorInfo, Error Templates and WPF</title><content type="html">&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:8b5e7d08-1bc1-48ce-97ec-d3c4b5c804df" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/XAML" rel="tag"&gt;XAML&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Smart+Client" rel="tag"&gt;Smart Client&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IDataErrorInfo" rel="tag"&gt;IDataErrorInfo&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Custom+Error+Templates" rel="tag"&gt;Custom Error Templates&lt;/a&gt;&lt;/div&gt; &lt;p&gt;Another gem of WPF is the ability to poll a data bound item for errors. This is done by implementing IDataErrorInfo in your entities (support was added into WPF in .NET 3.5).&lt;/p&gt; &lt;p&gt;The interface adds a string property “Error” and a string indexer.&amp;nbsp; The indexer accepts a property name and returns the error detail. A simple implementation for the indexer for our Product class (continued from my &lt;a href="http://japikse.blogspot.com/2009/07/inotifycollectionchanged-observable.html" target="_blank"&gt;previous posts&lt;/a&gt; in this WPF series) follows:&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;[&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; columnName]&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        var field = (FieldNames) Enum.Parse(&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt; (FieldNames), columnName);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;switch&lt;/span&gt; (field)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;case&lt;/span&gt; FieldNames.Inventory:&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (Inventory &amp;lt; 0)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; "&lt;span style="color: #8b0000"&gt;Inventory can not be less than zero&lt;/span&gt;";&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;case&lt;/span&gt; FieldNames.ModelName:&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (ModelName.Contains("&lt;span style="color: #8b0000"&gt;XXX&lt;/span&gt;"))&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; "&lt;span style="color: #8b0000"&gt;Our Store does not support adult content.&lt;/span&gt;";&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;case&lt;/span&gt; FieldNames.Price:&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (Price &amp;lt; 0)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; "&lt;span style="color: #8b0000"&gt;Price can not be less than zero&lt;/span&gt;";&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;default&lt;/span&gt;:&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Empty;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Error&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; NotImplementedException(); }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;The key to the indexer is the string value that is returned.&amp;nbsp; If the returned value is string.Empty or null, there is no error.&amp;nbsp; Otherwise an error condition exists.&amp;nbsp; In my simple example, the code considers a negative Inventory or Price to be an error condition, along with finding “XXX” in the ModelName.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;To have the WPF Window display an error condition simply add the ValidatesOnDataErrors=true attribute to the binding.&amp;nbsp; This uses the default error skin (thin red border) to graphically show the error condition. The updated XAML for the Inventory Text Box is updated to this:&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Row&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"3"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Column&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"1"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"1,1,1,1"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;HorizontalAlignment&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Stretch"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;     &lt;span style="color: #ff0000"&gt;Text&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"{Binding ElementName=ProductSelector, Path=SelectedItem.Inventory, ValidatesOnDataErrors=true}"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;The resulting UI appearance shown with a negative Inventory value is shown here:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_byyhrRXCSAk/Sl5FmpKHV3I/AAAAAAAAAGQ/2-RuoY9zsSQ/s1600-h/image%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_byyhrRXCSAk/Sl5FnfmQF5I/AAAAAAAAAGU/bSCoddH0yXA/image_thumb%5B5%5D.png?imgmax=800" width="451" height="353"&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;If you need more information supplied to the user, you don’t have to use the default error template.&amp;nbsp; The thin red line doesn’t convey enough information to the user, and is more detrimental than beneficial. At a minimum, the tool tip for the control needs to be set to the error text, and a more visual indicator that there is an issue.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_byyhrRXCSAk/Sl5FnjYTDxI/AAAAAAAAAGY/c_i-RdCL-3Q/s1600-h/image%5B16%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_byyhrRXCSAk/Sl5FocRlPuI/AAAAAAAAAGc/dMep4-GgxGo/image_thumb%5B19%5D.png?imgmax=800" width="486" height="334"&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;To do this, we are going to create a style that replaces the default error template.&amp;nbsp; The sample here only applies to Text Boxes, but can be simply extended for other controls.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;To set the ToolTip for the control, we use a Style Trigger that will be activated when the Validation.HasError property is true (this property is a benefit of IDataErrorInfo).&amp;nbsp; The Binding expression refers back to itself, and in the Path, we need to surround Validation.Errors in parentheses to indicate that it’s an attached property as opposed to a property of the TextBox.&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Trigger&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Property&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Validation.HasError"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"true"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Property&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"ToolTip"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;          &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"{Binding RelativeSource={x:Static RelativeSource.Self},&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;          Path=(Validation.Errors)[0].ErrorContent}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Trigger&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;The complete style (shown in the next code block) adds the red border and the asterisk as a replacement for Validation.ErrorTemplate, the default error template.&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Style&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TargetType&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"{x:Type TextBox}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Property&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Validation.ErrorTemplate"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter.Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ControlTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;DockPanel&lt;/span&gt; &lt;span style="color: #ff0000"&gt;LastChildFill&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"True"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBlock&lt;/span&gt; &lt;span style="color: #ff0000"&gt;DockPanel&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Dock&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Right"&lt;/span&gt; &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                       &lt;span style="color: #ff0000"&gt;Foreground&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Red"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                       &lt;span style="color: #ff0000"&gt;FontSize&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"14pt"&lt;/span&gt; &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                       &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"-15,0,0,0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;FontWeight&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Bold"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;*&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Border&lt;/span&gt; &lt;span style="color: #ff0000"&gt;BorderBrush&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Red"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;BorderThickness&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"1"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;AdornedElementPlaceholder&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"controlWithError"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Border&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;DockPanel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ControlTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter.Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Trigger&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Property&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Validation.HasError"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"true"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Property&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"ToolTip"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"{Binding RelativeSource={x:Static RelativeSource.Self},&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                Path=(Validation.Errors)[0].ErrorContent}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Trigger&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Style&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;The ErrorTemplate resides in the Adorner layer.&amp;nbsp; This allows for creating templates that appear to change the control being adorned.&amp;nbsp; By adding an additional border (with a Background=”Red” Opacity=”0.2”), we can create the look below, which is much more pronounced.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_byyhrRXCSAk/Sl5FpKKrfrI/AAAAAAAAAGg/IW7hjuFWfV4/s1600-h/image%5B21%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_byyhrRXCSAk/Sl5FprVz3sI/AAAAAAAAAGk/tVRkxKp-fZs/image_thumb%5B22%5D.png?imgmax=800" width="535" height="319"&gt;&lt;/a&gt;When the additional border with a background is added, the ToolTip on the TextBox never displays since the adorner captures the hover.&amp;nbsp; To solve this, we move the ToolTip to the DockPanel in the ErrorTemplate.&amp;nbsp; We now reference the name we gave the AdornedElementPlaceholder in our binding, and the ToolTip is back.&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Style&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TargetType&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"{x:Type TextBox}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Property&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Validation.ErrorTemplate"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter.Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ControlTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;DockPanel&lt;/span&gt; &lt;span style="color: #ff0000"&gt;LastChildFill&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"True"&lt;/span&gt; &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                           &lt;span style="color: #ff0000"&gt;ToolTip&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"{Binding ElementName=controlWithError,Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBlock&lt;/span&gt; &lt;span style="color: #ff0000"&gt;DockPanel&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Dock&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Right"&lt;/span&gt; &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                       &lt;span style="color: #ff0000"&gt;Foreground&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Red"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                       &lt;span style="color: #ff0000"&gt;FontSize&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"14pt"&lt;/span&gt; &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                       &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"-15,0,0,0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;FontWeight&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Bold"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;*&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Border&lt;/span&gt; &lt;span style="color: #ff0000"&gt;BorderBrush&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Red"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;BorderThickness&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"1"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Border&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Background&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Red"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Opacity&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"0.2"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;AdornedElementPlaceholder&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"controlWithError"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Border&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Border&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;DockPanel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ControlTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter.Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Style&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;em&gt;Updated 7/26/2009&lt;/em&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;There is an issue with the XAML above, in that the mouse clicks are swallowed by the Borders, and the text box doesn’t receive them. The solution to this is simple, and that is combining the Validation.ErrorTemplate property setter with Style Triggers.&amp;nbsp; The corrected XAML is below:&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Style&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TargetType&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"{x:Type TextBox}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Trigger&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Property&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Validation.HasError"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"true"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Property&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Background"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Pink"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Property&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Foreground"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Value&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Black"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Trigger&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Property&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Validation.ErrorTemplate"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter.Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ControlTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;DockPanel&lt;/span&gt; &lt;span style="color: #ff0000"&gt;LastChildFill&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"True"&lt;/span&gt; &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                   &lt;span style="color: #ff0000"&gt;ToolTip&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"{Binding ElementName=controlWithError,Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBlock&lt;/span&gt; &lt;span style="color: #ff0000"&gt;DockPanel&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Dock&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Right"&lt;/span&gt; &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                       &lt;span style="color: #ff0000"&gt;Foreground&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Red"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                       &lt;span style="color: #ff0000"&gt;FontSize&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"14pt"&lt;/span&gt; &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                       &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"-15,0,0,0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;FontWeight&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Bold"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;*&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Border&lt;/span&gt; &lt;span style="color: #ff0000"&gt;BorderBrush&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Red"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;BorderThickness&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"1"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;AdornedElementPlaceholder&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"controlWithError"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Border&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;DockPanel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ControlTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter.Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Setter&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Style&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;In my &lt;a href="http://japikse.blogspot.com/2009/07/multi-value-error-conditions-with.html" target="_blank"&gt;next post&lt;/a&gt;, we look at evaluating error conditions based on multiple properties.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Happy Coding!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-4019753671375816709?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4rtxuMq_1hiD5PNexuU2jYF6ylQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4rtxuMq_1hiD5PNexuU2jYF6ylQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4rtxuMq_1hiD5PNexuU2jYF6ylQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4rtxuMq_1hiD5PNexuU2jYF6ylQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=6bh2Q3bv5Sk:icsIBscvVI4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=6bh2Q3bv5Sk:icsIBscvVI4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=6bh2Q3bv5Sk:icsIBscvVI4:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=6bh2Q3bv5Sk:icsIBscvVI4:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=6bh2Q3bv5Sk:icsIBscvVI4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=6bh2Q3bv5Sk:icsIBscvVI4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=6bh2Q3bv5Sk:icsIBscvVI4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=6bh2Q3bv5Sk:icsIBscvVI4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=6bh2Q3bv5Sk:icsIBscvVI4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=6bh2Q3bv5Sk:icsIBscvVI4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=6bh2Q3bv5Sk:icsIBscvVI4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=6bh2Q3bv5Sk:icsIBscvVI4:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/6bh2Q3bv5Sk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/4019753671375816709/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/07/idataerrorinfo-error-templates-and-wpf.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/4019753671375816709?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/4019753671375816709?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/6bh2Q3bv5Sk/idataerrorinfo-error-templates-and-wpf.html" title="IDataErrorInfo, Error Templates and WPF" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_byyhrRXCSAk/Sl5FnfmQF5I/AAAAAAAAAGU/bSCoddH0yXA/s72-c/image_thumb%5B5%5D.png?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/07/idataerrorinfo-error-templates-and-wpf.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUNSXk5eSp7ImA9WxJUFkQ.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-8512355061613960449</id><published>2009-07-12T21:46:00.001-04:00</published><updated>2009-07-15T17:11:38.721-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-15T17:11:38.721-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WPF" /><category scheme="http://www.blogger.com/atom/ns#" term="Smart Client" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><title>INotifyCollectionChanged (Observable Collections) and WPF</title><content type="html">&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:8f7d10bf-5c9b-436c-a20b-633e6b868ef9" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/XAML" rel="tag"&gt;XAML&lt;/a&gt;,&lt;a href="http://technorati.com/tags/INotifyCollectionChanged" rel="tag"&gt;INotifyCollectionChanged&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ObservableCollection" rel="tag"&gt;ObservableCollection&lt;/a&gt;&lt;/div&gt; &lt;p&gt;In my previous post (&lt;a href="http://japikse.blogspot.com/2009/07/multibinding-and-command-parameters-in.html" target="_blank"&gt;MultiBinding and Command Parameters in WPF&lt;/a&gt;), I discussed how you can pass multiple values into a CommandParameter.&amp;nbsp; In this post, In this post, we will make sure the User Interface get’s updated when the Collection changes (items are added or removed), and will need MultiBindings to keep the View Model clean.&amp;nbsp; If you haven’t yet implement INotifyPropertyChanged on your entities, see my previous post on &lt;a href="http://japikse.blogspot.com/2009/07/inotifypropertychanged-and-wpf.html" target="_blank"&gt;INotifyPropertyChanged and WPF&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;We want our ComboBox (or any list control, for that matter) to accurately display the list of items in the collection when said collections change.&amp;nbsp; We get this functionality by implementing INotifyCollectionChanged (we get this out of the box with the ObservableCollection collection class, but we are going to implement it by hand first).&amp;nbsp; But before we jump into coding, lets create the framework and the failing test (albeit a UI test).&lt;/p&gt; &lt;p&gt;To do this, we are going to start with the Add Product functionality.&amp;nbsp; This will build on the previous MultiBinding from the Update Price command, and leverage the same Parameter and MultiValueConverter classes. We first refactor the XAML to move the resource definition to the Window as shown here:&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Window.Resources&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;ViewModels&lt;/span&gt;:&lt;span style="color: #800000"&gt;ChangeNotificationMultiConverter&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Key&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"ChangeNotificationMultiConverter"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Window.Resources&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;We also need to refactor the ChangeNotificationParameter class to include another property for the List itself.&amp;nbsp; I chose to add another property instead of create a new parameter class since we will be needing all of the fields for the Delete implementation. The new code is shown here:&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ChangeNotificationParameter&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ContentControl CallBackControl { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Product Prod { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IList&amp;lt;Product&amp;gt; Products { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;The last refactoring we need to conduct is in the MultiValueConverter itself to take advantage of the new property.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The XAML for the new button (placed in the StackPanel with the Update Price button) looks like this (passing in the Products List from the View Model and the Label from the Window):&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"3"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Content&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Add Product"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #ff0000"&gt;Command&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"{Binding Path=AddProductCmd}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Button.CommandParameter&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;MultiBinding&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Converter&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"{StaticResource ChangeNotificationMultiConverter}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;MultiBinding.Bindings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Binding&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Path&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Products"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Binding&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ElementName&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"CurrentValue"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;MultiBinding.Bindings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;MultiBinding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Button.CommandParameter&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;The final implementation is for the AddProductCommand, shown here:&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; AddProductCommand : ICommand&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Execute(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; parameter)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        var p = parameter &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; ChangeNotificationParameter;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (p == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; || p.Products == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        p.Products.Add(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Product { ID = 20, ModelName = "&lt;span style="color: #8b0000"&gt;New Model&lt;/span&gt;", Inventory = 20, Price = 20M, SKU = "&lt;span style="color: #8b0000"&gt;1234567890&lt;/span&gt;" });&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (p.CallBackControl != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            p.CallBackControl.Content = p.Products.Count.ToString();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; CanExecute(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; parameter)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;event&lt;/span&gt; EventHandler CanExecuteChanged;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;When we run the app, we see that we have two items in the ComboBox (our two hardcoded products).&amp;nbsp; Clicking the Add Product button adds a product (confirmed by the label), but our ComboBox still shows only two items.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_byyhrRXCSAk/SlqSCe8IxlI/AAAAAAAAAGA/Jpbm_s87TBk/s1600-h/image4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_byyhrRXCSAk/SlqSDLjw8-I/AAAAAAAAAGE/eSKwVJrVxro/image_thumb5.png?imgmax=800" width="414" height="330"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;To enable the hook up of the notifications, we need to create a custom class that implements INotifyPropertyChanged.&amp;nbsp; We also want to keep our list as an IList&amp;lt;Product&amp;gt; (our current implementation).&amp;nbsp; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;I first create an interface with both interfaces included.&amp;nbsp; In this manner, I can still code to an interface instead of concrete classes.&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;interface&lt;/span&gt; IProductList:IList&amp;lt;Product&amp;gt;,INotifyCollectionChanged {}&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Now for the class itself.&amp;nbsp; I chose to use the Decorator pattern, since it provided the least friction.&amp;nbsp; There is still a bit of code to write, but less than other options I considered. The entire class is shown here:&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ProductList:IProductList&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; IList&amp;lt;Product&amp;gt; _products;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ProductList(IList&amp;lt;Product&amp;gt; products)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        _products = products;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IEnumerator&amp;lt;Product&amp;gt; GetEnumerator()&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _products.GetEnumerator();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    IEnumerator IEnumerable.GetEnumerator()&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; GetEnumerator();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Add(Product item)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        _products.Add(item);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        notifyCollectionChanged(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add,item));&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Clear()&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        _products.Clear();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        notifyCollectionChanged(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; Contains(Product item)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _products.Contains(item);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; CopyTo(Product[] array, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; arrayIndex)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        _products.CopyTo(array, arrayIndex);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; Remove(Product item)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        var removed = _products.Remove(item);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (removed)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            notifyCollectionChanged(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove,item));&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; removed;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; Count&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _products.Count; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; IsReadOnly&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _products.IsReadOnly; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; IndexOf(Product item)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _products.IndexOf(item);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Insert(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; index, Product item)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        _products.Insert(index, item);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        notifyCollectionChanged(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; RemoveAt(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; index)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        _products.RemoveAt(index);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        notifyCollectionChanged(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Product &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;[&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; index]&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _products[index]; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            _products[index] = &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            notifyCollectionChanged(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace,_products[index]));&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;event&lt;/span&gt; NotifyCollectionChangedEventHandler CollectionChanged;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; notifyCollectionChanged(NotifyCollectionChangedEventArgs args)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (CollectionChanged != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            CollectionChanged(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;, args);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;For each of&amp;nbsp; the methods that alter the collection, we need to raise the CollectionChanged event.&amp;nbsp; This event has a custom Event Arguments class that takes in its constructor an enumeration of the change that took place (Add, Move, Replace, Reset, or Remove).&amp;nbsp; (One could argue whether it makes sense to make specific action calls or always declare the action as Reset, but that isn’t the purpose of this post.)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The ViewModel needs to be changed to utilize the new collection class.&amp;nbsp; The altered code is shown here:&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ChangeNotificationViewModel()&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    Products = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ProductList(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ProductService().GetProducts());&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ChangeNotificationViewModel(IList&amp;lt;Product&amp;gt; products)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    Products = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ProductList(products);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IProductList Products { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Now when you click to Add Product, the list automatically shows the new product.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_byyhrRXCSAk/SlqSDTHNKUI/AAAAAAAAAGI/hhPtUBUUcdo/s1600-h/image%5B5%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_byyhrRXCSAk/SlqSD4vp_vI/AAAAAAAAAGM/tpVEwkFbPcM/image_thumb%5B5%5D.png?imgmax=800" width="414" height="326"&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Now, to do it the easy way!&amp;nbsp; Change the ViewModel code to use an Observable Collection, and you can eliminate the entire custom class!&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ChangeNotificationViewModel()&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    Products = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ObservableCollection&amp;lt;Product&amp;gt;(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ProductService().GetProducts());&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ChangeNotificationViewModel(IEnumerable&amp;lt;Product&amp;gt; products)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    Products = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ObservableCollection&amp;lt;Product&amp;gt;(products);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IList&amp;lt;Product&amp;gt; Products { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Much simpler!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;In my next post, we take a look into &lt;a href="http://japikse.blogspot.com/2009/07/idataerrorinfo-error-templates-and-wpf.html" target="_blank"&gt;IDataErrorInfo and Error Templates in WPF&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Happy Coding!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-8512355061613960449?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VTHwdcuAeSNRxt7ZIO-a4uagNoo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VTHwdcuAeSNRxt7ZIO-a4uagNoo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VTHwdcuAeSNRxt7ZIO-a4uagNoo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VTHwdcuAeSNRxt7ZIO-a4uagNoo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=PSPiHHGMp1g:wYs3R5WvqxA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=PSPiHHGMp1g:wYs3R5WvqxA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=PSPiHHGMp1g:wYs3R5WvqxA:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=PSPiHHGMp1g:wYs3R5WvqxA:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=PSPiHHGMp1g:wYs3R5WvqxA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=PSPiHHGMp1g:wYs3R5WvqxA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=PSPiHHGMp1g:wYs3R5WvqxA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=PSPiHHGMp1g:wYs3R5WvqxA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=PSPiHHGMp1g:wYs3R5WvqxA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=PSPiHHGMp1g:wYs3R5WvqxA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=PSPiHHGMp1g:wYs3R5WvqxA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=PSPiHHGMp1g:wYs3R5WvqxA:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/PSPiHHGMp1g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/8512355061613960449/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/07/inotifycollectionchanged-observable.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/8512355061613960449?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/8512355061613960449?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/PSPiHHGMp1g/inotifycollectionchanged-observable.html" title="INotifyCollectionChanged (Observable Collections) and WPF" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_byyhrRXCSAk/SlqSDLjw8-I/AAAAAAAAAGE/eSKwVJrVxro/s72-c/image_thumb5.png?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/07/inotifycollectionchanged-observable.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08DR388eip7ImA9WxJUFEk.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-6456644810929415366</id><published>2009-07-12T16:42:00.001-04:00</published><updated>2009-07-12T21:51:16.172-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-12T21:51:16.172-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WPF" /><category scheme="http://www.blogger.com/atom/ns#" term="Smart Client" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><title>MultiBinding and Command Parameters in WPF</title><content type="html">&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:da2e5f4a-930e-4b37-9621-03601e1f6f8f" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MultiBinding" rel="tag"&gt;MultiBinding&lt;/a&gt;,&lt;a href="http://technorati.com/tags/CommandParameter" rel="tag"&gt;CommandParameter&lt;/a&gt;,&lt;a href="http://technorati.com/tags/XAML" rel="tag"&gt;XAML&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;&lt;/div&gt; &lt;p&gt;In my previous post (&lt;a href="http://japikse.blogspot.com/2009/07/inotifypropertychanged-and-wpf.html" target="_blank"&gt;INotifyPropertyChanged and WPF&lt;/a&gt;), I discussed how WPF can detect when the values of properties change.&amp;nbsp; In that post, I fired off a Message Box from the View Model, and commented that you shouldn’t do this.&amp;nbsp; However, I didn’t expound on how to work around this.&amp;nbsp; In this post, I am going to show how we can pass multiple values into the Command as the Command Parameter so we can interact with the user through the View with a much cleaner implementation.&lt;/p&gt; &lt;p&gt;Instead of a message box, we are going to add a label to the form that will display the current price of the Product. When we update the price, the label gets updated with the current price of the product displayed.&amp;nbsp; Note the it isn’t bound to anything in the product, it is purely a UI item.&amp;nbsp; The finished product will look like this (with the INotifyPropertyChanged event handler NOT getting fired):&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_byyhrRXCSAk/SlpKl6OAxrI/AAAAAAAAAF4/6qM_ysa2ldA/s1600-h/image%5B11%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_byyhrRXCSAk/SlpKoF65DFI/AAAAAAAAAF8/s_w8aUoM5nM/image_thumb%5B19%5D.png?imgmax=800" width="437" height="350"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;The XAML changes for the label are minor.&amp;nbsp; We add an additional RowDefinition to the table, and in that row, add two label controls.&amp;nbsp; One for the actual “Label” and the other to hold the price.&lt;/p&gt; &lt;p&gt;The changes for the Button allow us to pass in the multiple parameters into the CommandParameter.&amp;nbsp; To implement this, we need to execute the following steps:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Create a class to hold our parameters.&amp;nbsp; This is due to the fact that the Execute method of the ICommand interface allows for only a single object.&amp;nbsp; I create custom classes to give type safety to my code and therefore a cleaner implementation.  &lt;li&gt;Create a class that implements IMultiValueConverter.&amp;nbsp; This converts our multiple parameters into the class that we created in step 1.  &lt;li&gt;Change the XAML for the button to use a MultiBinding instead of a single binding.  &lt;li&gt;Change the Execute method of the ICommand implementation to use this new parameter type.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;The Parameter class is very straightforward, having two properties.&amp;nbsp; One is for the product that is the target of the invocation, and the other is for the UIElement that will receive the updated value for display to the user. I typed the UIElement as a ContentControl to allow for more re-use instead of typing it as a Label.&amp;nbsp; I don’t have any other uses currently, and some would argue YAGNI (you ain’t gonna need it) here, but the code is still very clear, so I opted for the less specific implementation.&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ChangeNotificationParameter&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ContentControl CallBackControl { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Product Prod { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;To implement IMultiValueConverter, create a new class.&amp;nbsp; There are two methods in the interface, Convert and ConvertBack.&amp;nbsp; For this use case we only need to implement Covert.&amp;nbsp; The first parameter to the Convert method is an array of objects that are the binding values set in the XAML of the control on the Window.&amp;nbsp; There are several other parameters that we won’t need to worry about here, but will be discussed in a later post.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;A new ChangeNotificationParameter is created, and it’s properties are set in the Convert method.&amp;nbsp; I iterate through the list of objects, checking their type, and then correctly assign the properties of the parameter class.&amp;nbsp; Again, one could argue that you know the order of the parameters set in the XAML, but I opt for a more defensive stance in case the order isn’t guaranteed.&amp;nbsp; The return value of the method is what gets passed into the Execute method if the ICommand implementation.&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ChangeNotificationMultiConverter : IMultiValueConverter&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; Convert(&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;[] values, &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        Type targetType, &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; parameter, &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        System.Globalization.CultureInfo culture)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        var param = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ChangeNotificationParameter();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var obj &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; values)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (obj &lt;span style="color: #0000ff"&gt;is&lt;/span&gt; Product)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                param.Prod = obj &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; Product;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (obj &lt;span style="color: #0000ff"&gt;is&lt;/span&gt; ContentControl)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                param.CallBackControl = obj &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; ContentControl;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; param;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;[] ConvertBack(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;, Type[] targetTypes, &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; parameter, System.Globalization.CultureInfo culture)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; NotImplementedException();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;To wire up the XAML to take advantage of this class, we have to do a few tasks.&amp;nbsp; First, add a namespace reference to where your MultiValueConverter’s namespace.&amp;nbsp; This is done at the top of the Window in the &amp;lt;Window element&amp;gt;.&amp;nbsp; This element now looks like this (assuming your namespace is “WPF.ViewModels”:&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Window&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Class&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"WPF.Views.ChangeNotification"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;x&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;ViewModels&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"clr-namespace:WPF.ViewModels"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #ff0000"&gt;Title&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Change Notification"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Height&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"235"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Width&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"300"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;Next, we remove the CommandParameter attribute and include the &amp;lt;Button.CommandParameter&amp;gt; element.&amp;nbsp; This contains the &amp;lt;MultiBinding&amp;gt; element, which has the “Converter” attribute.&amp;nbsp; The Window needs to know where it can find the type of the converter, so we need to add the type as a resource. I chose to add it to the button to make this post easier to read, but convention usually dictates resources are added at the Window level to allow reuse and readability.&amp;nbsp; Under the MultiBinding.Bindings element, we add a &amp;lt;Binding&amp;gt; element for each parameter that we need to pass into the command.&amp;nbsp; In this case the SelectedItem from the ProductSelector ComboBox (to get the current Product) and the Label “CurrentPrice”.&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"3"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Content&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Update Price"&lt;/span&gt; &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #ff0000"&gt;Command&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"{Binding Path=UpdatePriceCmd}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Button.Resources&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;ViewModels&lt;/span&gt;:&lt;span style="color: #800000"&gt;ChangeNotificationMultiConverter&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Key&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"ChangeNotificationMultiConverter"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Button.Resources&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Button.CommandParameter&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;MultiBinding&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Converter&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"{StaticResource ChangeNotificationMultiConverter}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;MultiBinding.Bindings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Binding&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ElementName&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"ProductSelector"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Path&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"SelectedItem"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Binding&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ElementName&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"CurrentPrice"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;MultiBinding.Bindings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;MultiBinding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Button.CommandParameter&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The final change is to the PriceUpdaterCommand to utilize the new parameter. The updated Execute is shown below (with some guards thrown in for safety).&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; PriceUpdaterCommand : ICommand&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Execute(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; parameter)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        var p = parameter &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; ChangeNotificationParameter;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (p == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; || p.Prod == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        p.Prod.Price *= 1.1M;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (p.CallBackControl != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            p.CallBackControl.Content = p.Prod.Price.ToString();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; CanExecute(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; parameter)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;event&lt;/span&gt; EventHandler CanExecuteChanged;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;In this way we’ve gotten rid of that nasty MessageBox call in the initial implementation, and extended our capabilities significantly.&amp;nbsp; We will use this pattern in the next segment, which dives into &lt;a href="http://japikse.blogspot.com/2009/07/inotifycollectionchanged-observable.html" target="_blank"&gt;INotifyCollectionChanged&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Happy Coding!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-6456644810929415366?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qoZ025RsPTLVTvY0HLAVs5Qjpo4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qoZ025RsPTLVTvY0HLAVs5Qjpo4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/qoZ025RsPTLVTvY0HLAVs5Qjpo4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qoZ025RsPTLVTvY0HLAVs5Qjpo4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=78XRjhh5Fvk:W3Uy64Ba6rc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=78XRjhh5Fvk:W3Uy64Ba6rc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=78XRjhh5Fvk:W3Uy64Ba6rc:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=78XRjhh5Fvk:W3Uy64Ba6rc:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=78XRjhh5Fvk:W3Uy64Ba6rc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=78XRjhh5Fvk:W3Uy64Ba6rc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=78XRjhh5Fvk:W3Uy64Ba6rc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=78XRjhh5Fvk:W3Uy64Ba6rc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=78XRjhh5Fvk:W3Uy64Ba6rc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=78XRjhh5Fvk:W3Uy64Ba6rc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=78XRjhh5Fvk:W3Uy64Ba6rc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=78XRjhh5Fvk:W3Uy64Ba6rc:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/78XRjhh5Fvk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/6456644810929415366/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/07/multibinding-and-command-parameters-in.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/6456644810929415366?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/6456644810929415366?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/78XRjhh5Fvk/multibinding-and-command-parameters-in.html" title="MultiBinding and Command Parameters in WPF" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_byyhrRXCSAk/SlpKoF65DFI/AAAAAAAAAF8/s_w8aUoM5nM/s72-c/image_thumb%5B19%5D.png?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/07/multibinding-and-command-parameters-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MGRX88eip7ImA9WxJUFE4.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-4672370252071519420</id><published>2009-07-11T10:05:00.001-04:00</published><updated>2009-07-12T16:43:44.172-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-12T16:43:44.172-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WPF" /><category scheme="http://www.blogger.com/atom/ns#" term="Smart Client" /><category scheme="http://www.blogger.com/atom/ns#" term="XAML" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><title>INotifyPropertyChanged and WPF</title><content type="html">&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:631861a1-f7f2-4b08-a512-86729b6cc003" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Smart+Client" rel="tag"&gt;Smart Client&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/.NET" rel="tag"&gt;.NET&lt;/a&gt;,&lt;a href="http://technorati.com/tags/XAML" rel="tag"&gt;XAML&lt;/a&gt;&lt;/div&gt; &lt;p&gt;Windows Presentation Foundation provides a lot of “Out Of The Box” features that greatly enhance the development and user experience.&amp;nbsp; One of these is the auto-hookup of the INotifyPropertyChanged.&amp;nbsp; What does this mean?&amp;nbsp; It means that if the data that you bind to in you WPF changes (and correctly implements INotifyPropertyChanged), it will be reflected in the user interface auto-magically!&lt;/p&gt; &lt;p&gt;To demonstrate this, we will create a very simple Product class.&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Product&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; ID { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;internal&lt;/span&gt; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; ModelName { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; SKU { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;decimal&lt;/span&gt; Price { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; Inventory { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Since we don’t want to bind directly to the model classes, we will create a (again, very simple) View Model to bind our window to.&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ChangeNotificationViewModel&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ChangeNotificationViewModel()&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #008000"&gt;//TODO: Get From Service or Datastore&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        Products = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ProductService().GetProducts();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ChangeNotificationViewModel(IList&amp;lt;Product&amp;gt; products)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        _products = products;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; IList&amp;lt;Product&amp;gt; _products;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IList&amp;lt;Product&amp;gt; Products&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _products; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;set&lt;/span&gt; { _products = &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; ICommand _updatePrice;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ICommand UpdatePriceCommand&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (_updatePrice == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                _updatePrice = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; PriceUpdater();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _updatePrice;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;set&lt;/span&gt; { _updatePrice = &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; PriceUpdater :ICommand&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Execute(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; parameter)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            var p = parameter &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; Product;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (p == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            p.Price *= 1.1M;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; CanExecute(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; parameter)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;event&lt;/span&gt; EventHandler CanExecuteChanged;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;A couple things to point out about the view model.&amp;nbsp; &lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;We use Dependency Injection in one constructor to take an IList&amp;lt;Product&amp;gt;.&amp;nbsp; This allows us to better test our view model, and opens up the door for several different methods of getting the constituted data into the View Model. &lt;br /&gt;&lt;li&gt;The internal constructor is in place to get some initial data as we are spiking up the Window so we reduce complexity. &lt;br /&gt;&lt;li&gt;The only real code that the WPF Window cares about is the Products and the UpdatePriceCommand properties, as that is what the Window will bind to. &lt;br /&gt;&lt;li&gt;This is a very rudimentary implementation of the Command Pattern.&amp;nbsp; I will enhance this in a future blog post as the application gets flushed out into a true MVVM implementation.&amp;nbsp; Typically firing off a UI specific item like a MessageBox is not a good idea in the View Model, but it is here to demonstrate the INotifyPropertyChanged concept that this post is focusing on.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;Now let’s get a very simple WPF Window coded up to display the data. The ComboBox allows for the selection of the product, and once one is selected, the text boxes are populated with the values for the product. The Window that we create looks like this:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_byyhrRXCSAk/SlicErTKkkI/AAAAAAAAAFw/qQeemSOpK5U/s1600-h/Notify13.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Notify1" border="0" alt="Notify1" src="http://lh6.ggpht.com/_byyhrRXCSAk/SlicE0RyGdI/AAAAAAAAAF0/08mwlaCQNws/Notify1_thumb1.png?imgmax=800" width="375" height="254"&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;And the XAML for the window looks like this:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Window&lt;/span&gt; &lt;span style="color: #ff0000"&gt;x&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;Class&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"WPF.Views.ChangeNotification"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;x&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #ff0000"&gt;Title&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Change Notification"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Height&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"200"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Width&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"300"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Grid&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;IsSharedSizeScope&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"True"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Height&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Auto"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Height&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"*"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Height&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Auto"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Grid&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Row&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Column&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;HorizontalAlignment&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Stretch"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Height&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Auto"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ColumnDefinition&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Width&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Auto"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;SharedSizeGroup&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Label"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ColumnDefinition&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Width&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"*"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Label&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Row&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Column&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"0,0,1,0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;HorizontalAlignment&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Right"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Products:&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Label&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ComboBox&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"ProductSelector"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Row&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Column&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"1"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"2,1,2,1"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                      &lt;span style="color: #ff0000"&gt;ItemsSource&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"{Binding Path=Products}"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                      &lt;span style="color: #ff0000"&gt;DisplayMemberPath&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"ModelName"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Grid&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Grid&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Row&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"1"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Column&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;HorizontalAlignment&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Stretch"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;VerticalAlignment&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Stretch"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Height&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Auto"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Height&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Auto"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Height&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Auto"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Height&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Auto"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ColumnDefinition&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Width&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Auto"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;SharedSizeGroup&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Label"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ColumnDefinition&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Width&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"*"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Label&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Row&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Column&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"0,0,1,0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;HorizontalAlignment&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Right"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;ModelName:&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Label&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Row&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Column&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"1"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"1,1,1,1"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;HorizontalAlignment&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Stretch"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                     &lt;span style="color: #ff0000"&gt;Text&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"{Binding ElementName=ProductSelector, Path=SelectedItem.ModelName}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Label&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Row&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"1"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Column&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"0,0,1,0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;HorizontalAlignment&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Right"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;SKU:&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Label&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Row&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"1"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Column&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"1"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"1,1,1,1"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;HorizontalAlignment&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Stretch"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                     &lt;span style="color: #ff0000"&gt;Text&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"{Binding ElementName=ProductSelector, Path=SelectedItem.SKU}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Label&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Row&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"2"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Column&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"0,0,1,0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;HorizontalAlignment&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Right"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Price:&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Label&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Row&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"2"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Column&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"1"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"1,1,1,1"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;HorizontalAlignment&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Stretch"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                     &lt;span style="color: #ff0000"&gt;Text&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"{Binding ElementName=ProductSelector, Path=SelectedItem.Price}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Label&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Row&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"3"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Column&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"0,0,1,0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;HorizontalAlignment&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Right"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Inventory:&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Label&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Row&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"3"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Column&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"1"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Margin&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"1,1,1,1"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;HorizontalAlignment&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Stretch"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                     &lt;span style="color: #ff0000"&gt;Text&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"{Binding ElementName=ProductSelector, Path=SelectedItem.Inventory}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Grid&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;StackPanel&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Row&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"2"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Grid&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;Column&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"0"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Content&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Update Price"&lt;/span&gt; &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #ff0000"&gt;Command&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"{Binding Path=UpdatePriceCommand}"&lt;/span&gt; &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;                    &lt;span style="color: #ff0000"&gt;CommandParameter&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"{Binding ElementName=ProductSelector, Path=SelectedItem}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Button&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;StackPanel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Grid&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Window&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Clicking on the Button increases the price of the currently selected product by 10%, then shows the new price in a message box.&amp;nbsp; However, the data bound text box doesn’t change the Price text to reflect the updated price.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;This is where in WinForms we would need to add event handlers or other types of call backs to make sure the UI accurately reflects the state of the data when a change occurs.&amp;nbsp; In WPF, however, we merely need to correctly implement INotifyPropertyChanged and it all gets wired up automagically!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;To implement the pattern, we need to change all properties that we care about from auto properties to properties with backing fields.&amp;nbsp; This is so we can raise the NotifyPropertyChanged event in the setter.&amp;nbsp; The INotifyPropertyChanged interface consists of one event (PropertyChanged). The event arguments (PropertyChangedEventArgs) has one property that gets set in the constructor, and that is the property name that changed.&amp;nbsp; WPF will then poll its bindings to look for anything bound to that property and requery the data context for the current value.&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;event&lt;/span&gt; PropertyChangedEventHandler PropertyChanged;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; onPropertyChanged(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; fieldName)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;   &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (PropertyChanged != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;   {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;       PropertyChanged(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;,&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; PropertyChangedEventArgs(fieldName));&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;The first issue I have with this implementation is that we need to pass in a string for the property name, which can lead to run time errors if the properties change in our entity but the “magic strings” don’t get updated in our code.&amp;nbsp; If you have good test coverage, then this will get caught in development, but additionally, I create an enumeration of all of the properties on the entity, and pass the enumerated value into event raiser. The enumeration get updated each time I regenerate my entities from the data base (I use &lt;a href="http://www.codesmithtools.com/" target="_blank"&gt;CodeSmith&lt;/a&gt; templates), so I get compile time checking for my property names.&amp;nbsp; Here is the code for the Product class refactored:&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Product : INotifyPropertyChanged&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;{&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;enum&lt;/span&gt; FieldNames&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        ID,&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        ModelName,&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        SKU,&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        Price,&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        Inventory&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; _id;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; ID&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _id; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (_id == &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            _id = &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            onPropertyChanged(FieldNames.ID);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; _modelName;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; ModelName&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _modelName; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (_modelName == &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            _modelName = &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            onPropertyChanged(FieldNames.ModelName);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; _sku;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; SKU&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _sku; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (_sku == &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            _sku = &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            onPropertyChanged(FieldNames.SKU);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;decimal&lt;/span&gt; _price;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;decimal&lt;/span&gt; Price&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _price; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (_price == &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            _price = &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            onPropertyChanged(FieldNames.Price);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; _inventory;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; Inventory&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _inventory; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (_inventory == &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            _inventory = &lt;span style="color: #0000ff"&gt;value&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            onPropertyChanged(FieldNames.Inventory);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;event&lt;/span&gt; PropertyChangedEventHandler PropertyChanged;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; onPropertyChanged(Enum fieldName)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (PropertyChanged != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;            PropertyChanged(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;,&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; PropertyChangedEventArgs(fieldName.ToString()));&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;There are a couple of items missing from this implementation that will be discussed in a future post:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;IsNew: This is a calculated field that indicates if the entity is transient (has not yet been persisted) &lt;br /&gt;&lt;li&gt;IsDirty: This is also a calculated field that indicate if the entity has been updated (the onPropertyChanged method sets the property) &lt;br /&gt;&lt;li&gt;INotifyCollectionChanged: This interface allows for WPF to update elements bound to collections when the collection changes&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;In my &lt;a href="http://japikse.blogspot.com/2009/07/multibinding-and-command-parameters-in.html" target="_blank"&gt;next post&lt;/a&gt; I get rid of the MessageBox and show MultiBindings for CommandParameters.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Happy Coding!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-4672370252071519420?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1CQV3W7owy1R0X6Ren210Ux-u1Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1CQV3W7owy1R0X6Ren210Ux-u1Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1CQV3W7owy1R0X6Ren210Ux-u1Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1CQV3W7owy1R0X6Ren210Ux-u1Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=e1QcnSQ-mHA:B_M9DsoEreA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=e1QcnSQ-mHA:B_M9DsoEreA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=e1QcnSQ-mHA:B_M9DsoEreA:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=e1QcnSQ-mHA:B_M9DsoEreA:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=e1QcnSQ-mHA:B_M9DsoEreA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=e1QcnSQ-mHA:B_M9DsoEreA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=e1QcnSQ-mHA:B_M9DsoEreA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=e1QcnSQ-mHA:B_M9DsoEreA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=e1QcnSQ-mHA:B_M9DsoEreA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=e1QcnSQ-mHA:B_M9DsoEreA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=e1QcnSQ-mHA:B_M9DsoEreA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=e1QcnSQ-mHA:B_M9DsoEreA:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/e1QcnSQ-mHA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/4672370252071519420/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/07/inotifypropertychanged-and-wpf.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/4672370252071519420?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/4672370252071519420?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/e1QcnSQ-mHA/inotifypropertychanged-and-wpf.html" title="INotifyPropertyChanged and WPF" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_byyhrRXCSAk/SlicE0RyGdI/AAAAAAAAAF0/08mwlaCQNws/s72-c/Notify1_thumb1.png?imgmax=800" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/07/inotifypropertychanged-and-wpf.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08HRXY_cSp7ImA9WxJWEko.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-8204720829841738180</id><published>2009-06-17T17:57:00.001-04:00</published><updated>2009-06-17T17:57:14.849-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-17T17:57:14.849-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NDepend" /><category scheme="http://www.blogger.com/atom/ns#" term="Architecture" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><title>NDepend - a Quick Review</title><content type="html">&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:5906824a-099a-486f-8b4b-973adfa032f7" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/NDepend" rel="tag"&gt;NDepend&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Code+Quality" rel="tag"&gt;Code Quality&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Code+Metrics" rel="tag"&gt;Code Metrics&lt;/a&gt;&lt;/div&gt; &lt;p&gt;I finally got around to test driving NDepend today, and I must say it’s pretty slick.&amp;nbsp; I’m sure there is a ton more stuff it can do than what I’ve found so far, but here is a quick synopsis…&lt;/p&gt; &lt;p&gt;Starting it up is easy, simply start a new project or select “Analyze a set of .NET assemblies”.&amp;nbsp; Once that is done, however, the main screen can be a bit overwhelming. (TIP: Watch the videos on the NDepend site &lt;a href="http://www.ndepend.com/GettingStarted.aspx" target="_blank"&gt;http://www.ndepend.com/GettingStarted.aspx&lt;/a&gt;)&amp;nbsp; However, if you want to dive right in, hopefully this will help.&amp;nbsp; Actually, it’s pretty cool.&lt;/p&gt; &lt;p&gt;To get started, fire up VisualNDepend.exe.&amp;nbsp; When you create a new project, there is an option to Add Assemblies of a Visual Studio Solution.&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_byyhrRXCSAk/Sjlmq012y4I/AAAAAAAAAFU/-hlTqvFmZ6o/s1600-h/image%5B12%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_byyhrRXCSAk/Sjlmrd4vX_I/AAAAAAAAAFY/gZAv9_TtDag/image_thumb%5B6%5D.png?imgmax=800" width="620" height="191"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This will load all of your application assemblies on the left and your dependent assemblies on the right (including the requisite system assemblies).&lt;/p&gt; &lt;p&gt;The analysis tab allows for setting up some project options (probably could be call Project Options, but it’s just semantics).&amp;nbsp; The cool stuff here is if you run &lt;a href="http://www.ncover.com" target="_blank"&gt;NCover&lt;/a&gt; like I do, you can specify the coverage file so you get it all in the analysis.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_byyhrRXCSAk/SjlmrkPdvfI/AAAAAAAAAFc/0gdu6lkp1Kw/s1600-h/image%5B16%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_byyhrRXCSAk/SjlmsBcM6GI/AAAAAAAAAFg/BHkFJbtmseQ/image_thumb%5B8%5D.png?imgmax=800" width="465" height="342"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Once setup, click “Run Analysis”.&amp;nbsp; This loads up a web page with the summary, but also gets you to the screen shown here (admittedly hard to read):&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_byyhrRXCSAk/Sjlms2eb1wI/AAAAAAAAAFk/IHOpyo0p1c0/s1600-h/image%5B29%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_byyhrRXCSAk/SjlmtomvN5I/AAAAAAAAAFo/33N37xvY7vQ/image_thumb%5B15%5D.png?imgmax=800" width="511" height="343"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Here’s the key for me.&amp;nbsp; Focus on the CQL section at the bottom (highlighted in the red box).&amp;nbsp; This is a list of queries for your code.&amp;nbsp; The out of the box groups are:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Code Quality (14 sub queries)  &lt;li&gt;Design (17 sub queries)  &lt;li&gt;Unused Code / Dead Code (3 sub queries)  &lt;li&gt;Encapsulation (16 sub queries)  &lt;li&gt;Diff / Changes/ Evolution (44 sub queries)  &lt;li&gt;Test Coverage (29 sub queries)  &lt;li&gt;Purity / Immutability / Side-Effects (6 sub queries)  &lt;li&gt;Naming Conventions (13 sub queries)  &lt;li&gt;Statistics (12 sub queries)  &lt;li&gt;Samples of Custom Constraints (20 sub queries)  &lt;li&gt;Constraints extracted from Source Code (0 sub queries)&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;When you select one of the queries, you get detailed information about your code base.&amp;nbsp; Here I clicked on the “Name Too Long” query, and it determined that my test names are too long.&amp;nbsp;&amp;nbsp; In the Metrics Matrix Window (top right) you get color coding of the code base for hits on that particular rule.&amp;nbsp; Interesting graphic, but not that useful by itself, until you double click on the blue.&amp;nbsp; It then loads up your code in Visual Studio! (I would prefer it to load my solution as well, but maybe that’s a setting I haven’t tweaked yet). Same goes for the list on the left referred to as the Code Tree window). Single clicking on the method name gives you additional information in the Info Viewer window just below the code tree.&lt;/p&gt; &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_byyhrRXCSAk/SjlmuundwjI/AAAAAAAAAFs/hZgtn_O-vVs/image_thumb%5B20%5D.png?imgmax=800" width="611" height="394"&gt;&lt;/p&gt; &lt;p&gt;As I was clicking around, I saw that several of their default rules don’t match our coding standards (e.g. the “m_” prefix rule). Fortunately, the rules are cake-easy to edit and modify for your organizations standards.&amp;nbsp; Rules can be disabled and additional rules can be added as well.&lt;/p&gt; &lt;p&gt;So, the question I have to ask, and you should be asking yourself, is “Do I have time to code review all of the code that I should be code reviewing”. If your schedule is like mine, than the answer is “Absolutely not.”&amp;nbsp; If your answer is “Yes”, then I have to ask “How do you find the time?” and “Couldn’t you be doing something more productive?”&lt;/p&gt; &lt;p&gt;Bottom line (for me) is this.&amp;nbsp; NDepend will help find those sections of code that need a code review so you don’t have to waste time sifting through your entire codebase to do code reviews, or (worse) throwing darts at the wall to decide.&lt;/p&gt; &lt;p&gt;If you value your time and your code quality, get a copy, and start using it.&amp;nbsp; Does it do more than this?&amp;nbsp; I’m sure it does.&amp;nbsp; But does it need to?&amp;nbsp; &lt;/p&gt; &lt;p&gt;Happy Coding!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-8204720829841738180?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eOQHlqgaANNDLVp6Ug0dhFDIaHc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eOQHlqgaANNDLVp6Ug0dhFDIaHc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/eOQHlqgaANNDLVp6Ug0dhFDIaHc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eOQHlqgaANNDLVp6Ug0dhFDIaHc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=G2V-a6cePb8:ukuRm8RKxY0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=G2V-a6cePb8:ukuRm8RKxY0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=G2V-a6cePb8:ukuRm8RKxY0:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=G2V-a6cePb8:ukuRm8RKxY0:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=G2V-a6cePb8:ukuRm8RKxY0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=G2V-a6cePb8:ukuRm8RKxY0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=G2V-a6cePb8:ukuRm8RKxY0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=G2V-a6cePb8:ukuRm8RKxY0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=G2V-a6cePb8:ukuRm8RKxY0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=G2V-a6cePb8:ukuRm8RKxY0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=G2V-a6cePb8:ukuRm8RKxY0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=G2V-a6cePb8:ukuRm8RKxY0:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/G2V-a6cePb8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/8204720829841738180/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/06/ndepend-quick-review.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/8204720829841738180?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/8204720829841738180?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/G2V-a6cePb8/ndepend-quick-review.html" title="NDepend - a Quick Review" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_byyhrRXCSAk/Sjlmrd4vX_I/AAAAAAAAAFY/gZAv9_TtDag/s72-c/image_thumb%5B6%5D.png?imgmax=800" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/06/ndepend-quick-review.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08HSH85fyp7ImA9WxJRGU8.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-3645296985634925410</id><published>2009-05-21T14:17:00.001-04:00</published><updated>2009-05-21T14:17:19.127-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-21T14:17:19.127-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="NHibernate" /><category scheme="http://www.blogger.com/atom/ns#" term="Cincinnati .Net Users Group" /><title>Cincinnati ORM Firestarter Registration is now open!</title><content type="html">&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:188f2924-490f-4eb6-9b7b-456fbbc1648a" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/CIncinnati+.NET+Users'+Group" rel="tag"&gt;CIncinnati .NET Users' Group&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ORM+Firestarter" rel="tag"&gt;ORM Firestarter&lt;/a&gt;,&lt;a href="http://technorati.com/tags/NHibernate" rel="tag"&gt;NHibernate&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Entity+Framework" rel="tag"&gt;Entity Framework&lt;/a&gt;,&lt;a href="http://technorati.com/tags/LINQ+to+SQL" rel="tag"&gt;LINQ to SQL&lt;/a&gt;&lt;/div&gt; &lt;p&gt;It’s true!&amp;nbsp; Registration for the ORM Firestarter is now open!&amp;nbsp; You can register at &lt;a href="http://tr.im/cincyorm"&gt;http://tr.im/cincyorm&lt;/a&gt;. More information about the event can be found on the official CINNUG website &lt;a title="http://cinnug.org/specialevents.aspx" href="http://cinnug.org/specialevents.aspx"&gt;http://cinnug.org/specialevents.aspx&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Registration is capped at 90, so make sure you reserve your spot quickly!&lt;/p&gt; &lt;p&gt;We will be serving Pizza for lunch, providing soda and water throughout the day, and have an exceptional cast of speakers coming in to get you started in NHibernate, LINQ to SQL, and the Entity Framework.&lt;/p&gt; &lt;p&gt;Happy coding!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-3645296985634925410?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uKV6W965fKHbC-quKtCSNnOEoGU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uKV6W965fKHbC-quKtCSNnOEoGU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uKV6W965fKHbC-quKtCSNnOEoGU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uKV6W965fKHbC-quKtCSNnOEoGU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=S4XW_VEPMyc:rMjJpXoHCM0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=S4XW_VEPMyc:rMjJpXoHCM0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=S4XW_VEPMyc:rMjJpXoHCM0:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=S4XW_VEPMyc:rMjJpXoHCM0:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=S4XW_VEPMyc:rMjJpXoHCM0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=S4XW_VEPMyc:rMjJpXoHCM0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=S4XW_VEPMyc:rMjJpXoHCM0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=S4XW_VEPMyc:rMjJpXoHCM0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=S4XW_VEPMyc:rMjJpXoHCM0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=S4XW_VEPMyc:rMjJpXoHCM0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=S4XW_VEPMyc:rMjJpXoHCM0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=S4XW_VEPMyc:rMjJpXoHCM0:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/S4XW_VEPMyc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/3645296985634925410/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/05/cincinnati-orm-firestarter-registration.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/3645296985634925410?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/3645296985634925410?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/S4XW_VEPMyc/cincinnati-orm-firestarter-registration.html" title="Cincinnati ORM Firestarter Registration is now open!" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/05/cincinnati-orm-firestarter-registration.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkICQnw8eSp7ImA9WxJREUk.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-6879324017626096499</id><published>2009-05-12T13:16:00.001-04:00</published><updated>2009-05-12T13:16:03.271-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-12T13:16:03.271-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WPF" /><category scheme="http://www.blogger.com/atom/ns#" term="Smart Client" /><category scheme="http://www.blogger.com/atom/ns#" term="Architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="Speaking" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><title>Client Application Development ArcReady Slides</title><content type="html">&lt;p&gt;I have been helping my Architect Evangelist for the Heartland District &lt;a href="http://www.twitter.com/BrianHPrince" target="_blank"&gt;Brian H. Prince&lt;/a&gt; with this quarter’s ArcReady events, and several folks have asked me to post the slides that I used for the presentation.&amp;nbsp; Most of these slides were given to me by the good folks in DPE, although I did do some modifications to the slide deck.&lt;/p&gt; &lt;p&gt;So, without further ado, the slides can be attained &lt;a href="http://skimedic.googlepages.com/ArcReadyFY09Q4-ArchitectingfortheCli.pdf" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Ping me if you have any questions, and as always, Happy Coding!&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:cfb76f0b-a970-4ccd-b5e2-fe0eef019e27" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/ArcReady" rel="tag"&gt;ArcReady&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Smart+Client" rel="tag"&gt;Smart Client&lt;/a&gt;,&lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Silverlight" rel="tag"&gt;Silverlight&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-6879324017626096499?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/l2o4IsDv8o0EkDSpoX05aEfB5qU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/l2o4IsDv8o0EkDSpoX05aEfB5qU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/l2o4IsDv8o0EkDSpoX05aEfB5qU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/l2o4IsDv8o0EkDSpoX05aEfB5qU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=UYLPUZkcQd4:wayX-j0ekd4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=UYLPUZkcQd4:wayX-j0ekd4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=UYLPUZkcQd4:wayX-j0ekd4:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=UYLPUZkcQd4:wayX-j0ekd4:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=UYLPUZkcQd4:wayX-j0ekd4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=UYLPUZkcQd4:wayX-j0ekd4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=UYLPUZkcQd4:wayX-j0ekd4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=UYLPUZkcQd4:wayX-j0ekd4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=UYLPUZkcQd4:wayX-j0ekd4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=UYLPUZkcQd4:wayX-j0ekd4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=UYLPUZkcQd4:wayX-j0ekd4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=UYLPUZkcQd4:wayX-j0ekd4:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/UYLPUZkcQd4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/6879324017626096499/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/05/client-application-development-arcready.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/6879324017626096499?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/6879324017626096499?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/UYLPUZkcQd4/client-application-development-arcready.html" title="Client Application Development ArcReady Slides" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/05/client-application-development-arcready.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYBQno4cSp7ImA9WxBRFE0.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-790922782056625526</id><published>2009-05-11T09:29:00.002-04:00</published><updated>2010-01-01T21:42:33.439-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-01T21:42:33.439-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JSSpec" /><category scheme="http://www.blogger.com/atom/ns#" term="Unit Testing" /><category scheme="http://www.blogger.com/atom/ns#" term="JQuery" /><category scheme="http://www.blogger.com/atom/ns#" term="Web Development" /><category scheme="http://www.blogger.com/atom/ns#" term="Speaking" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><title>StirTrek was Awesome!</title><content type="html">&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:05b6d3af-86e9-483c-8162-639c7aae8b27" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/StirTrek" rel="tag"&gt;StirTrek&lt;/a&gt;,&lt;a href="http://technorati.com/tags/JQuery" rel="tag"&gt;JQuery&lt;/a&gt;,&lt;a href="http://technorati.com/tags/JSSpec" rel="tag"&gt;JSSpec&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Web+Development" rel="tag"&gt;Web Development&lt;/a&gt;&lt;/div&gt;&lt;p&gt;So, it’s Monday morning, and we are all back to work.  But the weekend was capped by an excellent event in Columbus, OH. I always love going to events in an around the heartland, since it gives me an opportunity to catch up with so many friends and get great content at the same time.  This was no different.  Well, actually it was…we got to see the new Star Trek movie.  Imagine 400 geeks hanging out watching Star Trek…&lt;/p&gt;&lt;p&gt;Hats off to &lt;a href="http://twitter.com/jblankenburg" target="_blank"&gt;Jeff Blankenburg&lt;/a&gt;, &lt;a href="http://twitter.com/mattcasto" target="_blank"&gt;Matt Casto&lt;/a&gt;, &lt;a href="http://www.twitter.com/JodyAMorgan" target="_blank"&gt;Jody Morgan&lt;/a&gt;, &lt;a href="http://www.twitter.com/CareyPayette" target="_blank"&gt;Carey Payette&lt;/a&gt;, and any others I might have neglected to mention for putting on such an awesome event!&lt;/p&gt;&lt;p&gt;I attended some great sessions, had some great hallway conversations, and left a better developer for it all.  Here is what I attended (all of them were excellent):&lt;/p&gt;&lt;ul&gt;&lt;li&gt;What’s New in ASP.NET 4.0 (&lt;a title="Steve Smith" href="http://twitter.com/ardalis"&gt;Steve Smith&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Choosing Between ASP.NET Web Forms and MVC (&lt;a title="Rachel Appel" href="http://twitter.com/rachelappel"&gt;Rachel Appel&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Seeing Through The Clouds: Introduction to the Azure Services Platform (&lt;a title="Brian H. Prince" href="http://twitter.com/brianhprince"&gt;Brian H. Prince&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I gave a talk on JQuery called “JQuery and JSSpec – Making the Web Developer Friendly”.  I had some technical issues at the start (playing with Windows7 deep zoom for the first time in the middle of a talk is a bad idea), but recovered quickly, and made it through the material in the allotted time.&lt;/p&gt;&lt;p&gt;The samples can be found &lt;a href="http://skimedic.googlepages.com/JQuerySamples.zip" target="_blank"&gt;here&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;Happy Coding!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-790922782056625526?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/RKSt8N8GEpw6QnN-cDqNK5W3e_4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RKSt8N8GEpw6QnN-cDqNK5W3e_4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/RKSt8N8GEpw6QnN-cDqNK5W3e_4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RKSt8N8GEpw6QnN-cDqNK5W3e_4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=2nKVBE1bPSY:hPb1Fqeaigw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=2nKVBE1bPSY:hPb1Fqeaigw:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=2nKVBE1bPSY:hPb1Fqeaigw:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=2nKVBE1bPSY:hPb1Fqeaigw:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=2nKVBE1bPSY:hPb1Fqeaigw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=2nKVBE1bPSY:hPb1Fqeaigw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=2nKVBE1bPSY:hPb1Fqeaigw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=2nKVBE1bPSY:hPb1Fqeaigw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=2nKVBE1bPSY:hPb1Fqeaigw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=2nKVBE1bPSY:hPb1Fqeaigw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=2nKVBE1bPSY:hPb1Fqeaigw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=2nKVBE1bPSY:hPb1Fqeaigw:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/2nKVBE1bPSY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/790922782056625526/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/05/stirtrek-was-awesome.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/790922782056625526?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/790922782056625526?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/2nKVBE1bPSY/stirtrek-was-awesome.html" title="StirTrek was Awesome!" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/05/stirtrek-was-awesome.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08MQHY7fCp7ImA9WxJTE04.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-2622126673480593273</id><published>2009-04-21T13:44:00.001-04:00</published><updated>2009-04-21T13:44:41.804-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-21T13:44:41.804-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VisualSVN" /><category scheme="http://www.blogger.com/atom/ns#" term="VS2008" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><title>Why VisualSVN is Way Cool</title><content type="html">&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:8df5bae6-cb8d-497b-bd47-3a31d0565c03" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/VisualSVN" rel="tag"&gt;VisualSVN&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Source+Control" rel="tag"&gt;Source Control&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Visual+Studio+2008" rel="tag"&gt;Visual Studio 2008&lt;/a&gt;&lt;/div&gt; &lt;p&gt;I am a convert.&amp;nbsp; I admit it.&amp;nbsp; The Edit-Merge-Commit model for source control has me hooked.&amp;nbsp; I wish all of my projects would use source control software that fit that model.&amp;nbsp; I also want to be able to do commits and updates from either the command line or from within my development environment.&lt;/p&gt; &lt;p&gt;So I’ve been using &lt;a href="http://ankhsvn.open.collab.net/" target="_blank"&gt;AnkhSVN&lt;/a&gt; for SubVersion support in Visual Studio 2008.&amp;nbsp; AnkhSVN works really well, and is free, but has some limitations.&amp;nbsp; Mainly, you have to set it as your default Source Control tool.&amp;nbsp; That means that when you go back to work on a TFS code base, you have to remember to change your Source Control Provider, and back and forth.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.visualsvn.com/" target="_blank"&gt;VisualSVN&lt;/a&gt; works differently.&amp;nbsp; It doesn’t even show up in the Source Control Provider drop down (which made me pause for a second), but has it’s own menu in the Visual Studio toolbar.&amp;nbsp; So, on a whim, I opened up a TFS solution – sure enough, got prompted for my credentials, and connected just fine.&amp;nbsp; While that was open, I fired up another instance of Visual Studio and opened up a SVN based solution, and it worked seamlessly.&lt;/p&gt; &lt;p&gt;That reason alone has me convinced that VisualSVN is worth the price of admission.&lt;/p&gt; &lt;p&gt;Happy coding!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-2622126673480593273?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4ZMsP6kGBMx05BASWHdQLzx-5IA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4ZMsP6kGBMx05BASWHdQLzx-5IA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4ZMsP6kGBMx05BASWHdQLzx-5IA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4ZMsP6kGBMx05BASWHdQLzx-5IA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=-t9rj7M54Pk:Q6jHHnwSVMo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=-t9rj7M54Pk:Q6jHHnwSVMo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=-t9rj7M54Pk:Q6jHHnwSVMo:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=-t9rj7M54Pk:Q6jHHnwSVMo:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=-t9rj7M54Pk:Q6jHHnwSVMo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=-t9rj7M54Pk:Q6jHHnwSVMo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=-t9rj7M54Pk:Q6jHHnwSVMo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=-t9rj7M54Pk:Q6jHHnwSVMo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=-t9rj7M54Pk:Q6jHHnwSVMo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=-t9rj7M54Pk:Q6jHHnwSVMo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=-t9rj7M54Pk:Q6jHHnwSVMo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=-t9rj7M54Pk:Q6jHHnwSVMo:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/-t9rj7M54Pk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/2622126673480593273/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/04/why-visualsvn-is-way-cool.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/2622126673480593273?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/2622126673480593273?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/-t9rj7M54Pk/why-visualsvn-is-way-cool.html" title="Why VisualSVN is Way Cool" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/04/why-visualsvn-is-way-cool.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcNR3Y7eCp7ImA9WxJTEUo.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-190828676894619018</id><published>2009-04-19T15:41:00.001-04:00</published><updated>2009-04-19T15:41:36.800-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-19T15:41:36.800-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server" /><title>Error Dropping a User in SQL Server</title><content type="html">&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:13c25ef7-d62d-46ac-9331-3cf01d9367cc" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/SQL+Server" rel="tag"&gt;SQL Server&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Error+Dropping+User" rel="tag"&gt;Error Dropping User&lt;/a&gt;&lt;/div&gt; &lt;p&gt;When you need to drop a user from a SQL Server Database (maybe you entered the name wrong, it needs to be changed, whatever), quite often you will run into an error due to schema ownership.&lt;/p&gt; &lt;p&gt;“The database principal owns a schema in the database, and cannot be dropped.”&lt;/p&gt; &lt;p&gt;Try as you might, the GUI (Management Studio) isn’t going to help you out on this one.&amp;nbsp; You need to transfer the schema that matches the user name to another principal (like dbo) so that you can delete the user.&lt;/p&gt; &lt;p&gt;ALTER AUTHORIZATION ON SCHEMA::[&lt;em&gt;username&lt;/em&gt;] TO [&lt;em&gt;dbo&lt;/em&gt;]&lt;/p&gt; &lt;p&gt;Then you can delete the user.&lt;/p&gt; &lt;p&gt;Happy Coding!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-190828676894619018?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HuJBfSus9b3hzkUE-ATVj4t3n7Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HuJBfSus9b3hzkUE-ATVj4t3n7Y/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HuJBfSus9b3hzkUE-ATVj4t3n7Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HuJBfSus9b3hzkUE-ATVj4t3n7Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=L9wdrkTx3g0:kWxYbTJMy_I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=L9wdrkTx3g0:kWxYbTJMy_I:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=L9wdrkTx3g0:kWxYbTJMy_I:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=L9wdrkTx3g0:kWxYbTJMy_I:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=L9wdrkTx3g0:kWxYbTJMy_I:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=L9wdrkTx3g0:kWxYbTJMy_I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=L9wdrkTx3g0:kWxYbTJMy_I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=L9wdrkTx3g0:kWxYbTJMy_I:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=L9wdrkTx3g0:kWxYbTJMy_I:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=L9wdrkTx3g0:kWxYbTJMy_I:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=L9wdrkTx3g0:kWxYbTJMy_I:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=L9wdrkTx3g0:kWxYbTJMy_I:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/L9wdrkTx3g0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/190828676894619018/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/04/error-dropping-user-in-sql-server.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/190828676894619018?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/190828676894619018?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/L9wdrkTx3g0/error-dropping-user-in-sql-server.html" title="Error Dropping a User in SQL Server" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/04/error-dropping-user-in-sql-server.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUAER3c7eCp7ImA9WxJTEUs.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-376293877485650310</id><published>2009-04-19T15:01:00.001-04:00</published><updated>2009-04-19T15:01:46.900-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-19T15:01:46.900-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WPF" /><category scheme="http://www.blogger.com/atom/ns#" term="Web Development" /><category scheme="http://www.blogger.com/atom/ns#" term="Speaking" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><title>StirTrek is Coming!</title><content type="html">&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:39b1e83c-3d6b-46cc-98f1-2e10ae9f9a9f" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/StirTrek" rel="tag"&gt;StirTrek&lt;/a&gt;,&lt;a href="http://technorati.com/tags/JQuery" rel="tag"&gt;JQuery&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Web+Development" rel="tag"&gt;Web Development&lt;/a&gt;&lt;/div&gt; &lt;p&gt;On May 8th, Microsoft will be hosting a one day event with 10 great sessions of content for Web Development, straight from a large web oriented conference that Microsoft help in Las Vegas earlier this year (not sure if I’m allowed to say the title :-))&lt;/p&gt; &lt;p&gt;Here is the line up:&lt;/p&gt; &lt;li&gt;What's New in Silverlight 3 - &lt;a href="http://twitter.com/timheuer"&gt;Tim Heuer&lt;/a&gt; &lt;li&gt;.NET RIA Services: Building Data-driven Applications in ASP.NET and Silverlight - &lt;a href="http://twitter.com/timheuer"&gt;Tim Heuer&lt;/a&gt; &lt;li&gt;Choosing Between ASP.NET Web Forms and MVC - &lt;a href="http://twitter.com/rachelappel"&gt;Rachel Appel&lt;/a&gt; &lt;li&gt;What's New in ASP.NET 4.0 - &lt;a href="http://twitter.com/ardalis"&gt;Steve Smith&lt;/a&gt; &lt;li&gt;Internet Explorer 8, SuperPreview, and Web Platform Installer -&lt;br&gt;&lt;a href="http://twitter.com/jblankenburg"&gt;Jeff Blankenburg&lt;/a&gt; &lt;li&gt;Seeing Through The Clouds: Introduction to the Azure Services Platform - &lt;a href="http://twitter.com/brianhprince"&gt;Brian H. Prince&lt;/a&gt; &lt;li&gt;Building Microsoft Silverlight Controls - &lt;a href="http://twitter.com/mattcasto"&gt;Matt Casto&lt;/a&gt; &lt;li&gt;SketchFlow: From Concept To Production - &lt;a href="http://twitter.com/timhibner"&gt;Tim Hibner&lt;/a&gt; &lt;li&gt;What’s New In WPF 4 - &lt;a href="http://twitter.com/mjeaton"&gt;Michael Eaton&lt;/a&gt; &lt;li&gt;An Overview of jQuery - &lt;a href="http://twitter.com/skimedic"&gt;Phil Japikse&lt;/a&gt;&lt;/li&gt; &lt;p&gt;After a full day of learning, we get a special private screening of the brand new Star Trek movie! Registration is open here &lt;a title="http://stirtrek.eventbrite.com/" href="http://stirtrek.eventbrite.com/"&gt;http://stirtrek.eventbrite.com/&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;It will be rocking day – I hope to see you there!&lt;/p&gt; &lt;p&gt;Happy Coding!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-376293877485650310?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OP6BG4jBG-SdObNoDs3GierWVs0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OP6BG4jBG-SdObNoDs3GierWVs0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/OP6BG4jBG-SdObNoDs3GierWVs0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OP6BG4jBG-SdObNoDs3GierWVs0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=6F1QCr5FJ6U:TrpAtz0ri2g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=6F1QCr5FJ6U:TrpAtz0ri2g:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=6F1QCr5FJ6U:TrpAtz0ri2g:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=6F1QCr5FJ6U:TrpAtz0ri2g:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=6F1QCr5FJ6U:TrpAtz0ri2g:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=6F1QCr5FJ6U:TrpAtz0ri2g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=6F1QCr5FJ6U:TrpAtz0ri2g:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=6F1QCr5FJ6U:TrpAtz0ri2g:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=6F1QCr5FJ6U:TrpAtz0ri2g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=6F1QCr5FJ6U:TrpAtz0ri2g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=6F1QCr5FJ6U:TrpAtz0ri2g:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=6F1QCr5FJ6U:TrpAtz0ri2g:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/6F1QCr5FJ6U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/376293877485650310/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/04/stirtrek-is-coming.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/376293877485650310?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/376293877485650310?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/6F1QCr5FJ6U/stirtrek-is-coming.html" title="StirTrek is Coming!" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/04/stirtrek-is-coming.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQBSHo6eSp7ImA9WxJTEUs.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-6544117521581505957</id><published>2009-04-19T14:39:00.001-04:00</published><updated>2009-04-19T14:39:19.411-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-19T14:39:19.411-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Agile" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server" /><category scheme="http://www.blogger.com/atom/ns#" term="TDD" /><title>Central Ohio Day of .NET Wrap Up</title><content type="html">&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:d5aff076-f34d-4652-9d92-086154ebea92" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/SQL+Server" rel="tag"&gt;SQL Server&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Test+Driven+Development" rel="tag"&gt;Test Driven Development&lt;/a&gt;,&lt;a href="http://technorati.com/tags/T-SQL" rel="tag"&gt;T-SQL&lt;/a&gt;&lt;/div&gt; &lt;p&gt;I had a great time (again) at Central Ohio Day of .NET, despite presenting with a broken pinkie finger on my left hand.&amp;nbsp; (Ok, since you asked, I smashed it between a really heavy object and an immovable object.)&amp;nbsp; Turns out I use my pinkie when I type.&amp;nbsp; Who knew? (I think there is an alt key and a ctl key on the right side of my keyboard, but I just can’t find it…)&lt;/p&gt; &lt;p&gt;My session went very well (despite the pain in my finger).&amp;nbsp; I spoke on Test Driven Development for T-SQL (you can download my slides from &lt;a href="http://skimedic.googlepages.com/JapikseTSQLUnitTestingAndTDD.pdf" target="_blank"&gt;here&lt;/a&gt;).&amp;nbsp; My session was in the last time slot, which can be good or bad, but it was well attended, and followed by some really good questions, so the attendees were really listening!&lt;/p&gt; &lt;p&gt;I’ve been promoting and speaking TDD (in managed code) for a couple of years now, and I was challenged by a friend of mine to solve the problem for T-SQL.&amp;nbsp; I blogged about this in January (see post &lt;a href="http://japikse.blogspot.com/2009/01/unit-testing-t-sql-in-c.html" target="_blank"&gt;here&lt;/a&gt;) after working through the issue with a couple of co-workers, but it still wasn’t the best solution.&lt;/p&gt; &lt;p&gt;On the &lt;a href="http://www.gallio.org/" target="_blank"&gt;Gallio/MbUnit&lt;/a&gt; forums, someone suggested looking into &lt;a href="http://tst.codeplex.com/" target="_blank"&gt;TST&lt;/a&gt; (T-SQL Testing Framework) on Codeplex, so I gave it a whirl. Turns out it was a great fit for what I was trying to accomplish. I will blog more about how I’m using it later, but it’s definitely worth checking out.&amp;nbsp; As a sample of how you use it, here is one of my unit tests.&amp;nbsp; Note how the tool supports the ARRANGE/ACT/ASSERT pattern seamlessly!&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 480px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=ALTER&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;ALTER&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=PROCEDURE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;PROCEDURE&lt;/a&gt; SQLTest_UpdatePricesByCategoryID&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=AS&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;AS&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=BEGIN&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;BEGIN&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;span style="color: #008000"&gt;--Arrange&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=SET&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;SET&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=IDENTITY_INSERT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;IDENTITY_INSERT&lt;/a&gt; dbo.Categories &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=ON&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;ON&lt;/a&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=INSERT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;INSERT&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=INTO&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;INTO&lt;/a&gt; dbo.Categories (CategoryID,CategoryName,ParentCategoryID) &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;		&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=VALUES&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;VALUES&lt;/a&gt; ( 1,'&lt;span style="color: #8b0000"&gt;Test1&lt;/span&gt;',&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=null&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;null&lt;/a&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=INSERT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;INSERT&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=INTO&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;INTO&lt;/a&gt; dbo.Categories (CategoryID,CategoryName,ParentCategoryID) &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;		&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=VALUES&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;VALUES&lt;/a&gt; ( 2,'&lt;span style="color: #8b0000"&gt;Test2&lt;/span&gt;',&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=null&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;null&lt;/a&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=SET&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;SET&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=IDENTITY_INSERT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;IDENTITY_INSERT&lt;/a&gt; dbo.Categories &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=OFF&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;OFF&lt;/a&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=SET&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;SET&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=IDENTITY_INSERT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;IDENTITY_INSERT&lt;/a&gt; dbo.Products &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=ON&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;ON&lt;/a&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=INSERT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;INSERT&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=INTO&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;INTO&lt;/a&gt; dbo.Products (ProductID,CategoryID,ModelNumber,UnitCost,&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;		CurrentPrice,UnitsInStock) &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=VALUES&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;VALUES&lt;/a&gt; (1,1,'&lt;span style="color: #8b0000"&gt;Model1&lt;/span&gt;',1,1.5,10);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=INSERT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;INSERT&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=INTO&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;INTO&lt;/a&gt; dbo.Products (ProductID,CategoryID,ModelNumber,UnitCost,&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	CurrentPrice,UnitsInStock) &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=VALUES&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;VALUES&lt;/a&gt; (2,2,'&lt;span style="color: #8b0000"&gt;Model2&lt;/span&gt;',2,2.5,20);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=INSERT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;INSERT&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=INTO&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;INTO&lt;/a&gt; dbo.Products (ProductID,CategoryID,ModelNumber,UnitCost,&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	CurrentPrice,UnitsInStock) &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=VALUES&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;VALUES&lt;/a&gt; (3,2,'&lt;span style="color: #8b0000"&gt;Model3&lt;/span&gt;',3,3.5,30);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=SET&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;SET&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=IDENTITY_INSERT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;IDENTITY_INSERT&lt;/a&gt; dbo.Products &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=OFF&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;OFF&lt;/a&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;span style="color: #008000"&gt;--Act&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=EXEC&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;EXEC&lt;/a&gt; UpdatePricesByCategory 2,1.0;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;span style="color: #008000"&gt;--Assert&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=CREATE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;CREATE&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=TABLE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;TABLE&lt;/a&gt; #ExpectedResult (&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;		ProductID &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=INT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;INT&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=PRIMARY&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;PRIMARY&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=KEY&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;KEY&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NOT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;NOT&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NULL&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;NULL&lt;/a&gt;,&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;		UnitCost &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=money&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;money&lt;/a&gt;,&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;		CurrentPrice &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=MONEY&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;MONEY&lt;/a&gt;,&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;		UnitsInStock &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=int&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;int&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	) &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=CREATE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;CREATE&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=TABLE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;TABLE&lt;/a&gt; #ActualResult (&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;		ProductID &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=INT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;INT&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=PRIMARY&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;PRIMARY&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=KEY&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;KEY&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NOT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;NOT&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NULL&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;NULL&lt;/a&gt;,&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;		UnitCost &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=money&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;money&lt;/a&gt;,&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;		CurrentPrice &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=MONEY&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;MONEY&lt;/a&gt;,&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;		UnitsInStock &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=int&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;int&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	) &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=INSERT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;INSERT&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=INTO&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;INTO&lt;/a&gt; #ExpectedResult (ProductID,UnitCost,CurrentPrice,UnitsInStock) &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=VALUES&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;VALUES&lt;/a&gt; (1,1,1.5,10) ;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=INSERT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;INSERT&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=INTO&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;INTO&lt;/a&gt; #ExpectedResult (ProductID,UnitCost,CurrentPrice,UnitsInStock) &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=VALUES&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;VALUES&lt;/a&gt; (2,2,3.5,20) ;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=INSERT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;INSERT&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=INTO&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;INTO&lt;/a&gt; #ExpectedResult (ProductID,UnitCost,CurrentPrice,UnitsInStock) &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=VALUES&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;VALUES&lt;/a&gt; (3,3,4.5,30) ;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=INSERT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;INSERT&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=INTO&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;INTO&lt;/a&gt; #ActualResult (ProductID,UnitCost,CurrentPrice,UnitsInStock) &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;		&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=SELECT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;SELECT&lt;/a&gt; ProductID,UnitCost,CurrentPrice,UnitsInStock &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=FROM&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;FROM&lt;/a&gt; Products;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;	&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=EXEC&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;EXEC&lt;/a&gt; TST.Assert.TableEquals '&lt;span style="color: #8b0000"&gt;Changes Happened&lt;/span&gt;';&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=END&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;END&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=GO&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;GO&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt; More on this tool and TDD for T-SQL will be coming to these pages, so stay tuned!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Happy Coding! &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-6544117521581505957?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2tf7kXAqIY3x-kjxMG__kroDm3A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2tf7kXAqIY3x-kjxMG__kroDm3A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2tf7kXAqIY3x-kjxMG__kroDm3A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2tf7kXAqIY3x-kjxMG__kroDm3A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=J_TtYiGgYcc:T7nxG7QjXrU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=J_TtYiGgYcc:T7nxG7QjXrU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=J_TtYiGgYcc:T7nxG7QjXrU:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=J_TtYiGgYcc:T7nxG7QjXrU:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=J_TtYiGgYcc:T7nxG7QjXrU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=J_TtYiGgYcc:T7nxG7QjXrU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=J_TtYiGgYcc:T7nxG7QjXrU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=J_TtYiGgYcc:T7nxG7QjXrU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=J_TtYiGgYcc:T7nxG7QjXrU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=J_TtYiGgYcc:T7nxG7QjXrU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=J_TtYiGgYcc:T7nxG7QjXrU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=J_TtYiGgYcc:T7nxG7QjXrU:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/J_TtYiGgYcc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/6544117521581505957/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/04/central-ohio-day-of-net-wrap-up.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/6544117521581505957?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/6544117521581505957?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/J_TtYiGgYcc/central-ohio-day-of-net-wrap-up.html" title="Central Ohio Day of .NET Wrap Up" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/04/central-ohio-day-of-net-wrap-up.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEDRXszeyp7ImA9WxVaGUQ.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-1312209804661150450</id><published>2009-04-17T12:05:00.001-04:00</published><updated>2009-04-17T13:51:14.583-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-17T13:51:14.583-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Smart Client" /><category scheme="http://www.blogger.com/atom/ns#" term="Speaking" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><title>It Takes a Village…</title><content type="html">&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:7843ef13-4c2f-4948-b96f-84744b6cffb4" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Microsoft+MVP+Award" rel="tag"&gt;Microsoft MVP Award&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Community+Events" rel="tag"&gt;Community Events&lt;/a&gt;&lt;/div&gt; &lt;p&gt;On April 1st, I was notified that I had received an MVP award from Microsoft.&amp;nbsp; This is a great honor, and not one that I could have accomplished alone.&amp;nbsp; I wanted to take a moment to thank many people who helped me on this journey.&amp;nbsp; If I inadvertently leave someone out, flame me, and I will fix it!&lt;/p&gt; &lt;p&gt;First and foremost, &lt;a href="http://mvwood.com/" target="_blank"&gt;Mike Wood&lt;/a&gt;, who pushed me into speaking for the community.&amp;nbsp; I have done a ton of speaking and teaching over the years, but always for private classes and/or customers.&amp;nbsp; It wasn’t until I spoke at the Cincinnati Day of .NET in 2007 that I realized how important the community really is to me as a developer, and how I can give back to that community.&amp;nbsp; Mike has given me advice, urging (where necessary),&amp;nbsp; and criticism (where warranted) over the past two years, and for that I am very thankful.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.brianhprince.com/" target="_blank"&gt;Brian H. Prince&lt;/a&gt; has been an excellent influence and mentor as my Architect Evangelist from Microsoft DPE, and &lt;a href="http://jeffblankenburg.com/default.aspx" target="_blank"&gt;Jeff Blankenburg&lt;/a&gt; additionally has helped me along the road as my Developer Evangelist.&lt;/p&gt; &lt;p&gt;&lt;a href="http://frazzleddad.blogspot.com/" target="_blank"&gt;Jim Holmes&lt;/a&gt; for having the faith in me to have me speak at CodeMash (even though he didn’t really know me that well yet). &lt;a href="http://fallenrogue.com/" target="_blank"&gt;Leon Gersing&lt;/a&gt; for all of those great conversations and debates over beverages, &lt;a href="http://morewally.com/cs/Default.aspx" target="_blank"&gt;Wally McClure&lt;/a&gt; has made a point of introducing me to everyone he knows (which is a significant number of people) whenever we share the same geography, and &lt;a href="http://netcave.org" target="_blank"&gt;Alan Stevens&lt;/a&gt; who went out of his way at &lt;a href="http://www.codemash.org" target="_blank"&gt;CodeMash&lt;/a&gt; this year to bring me onto the radar screens of some people I hadn’t yet met.&lt;/p&gt; &lt;p&gt;Suzanna Moran, my MVP lead, and the Client Application Development Group at Microsoft who gave me the award.&lt;/p&gt; &lt;p&gt;And lastly, all of the user group leaders and conference organizers for all that you do, and for allowing me to speak in front of your attendees. You guys are the ones that make the community as great as it is, and I’m glad I’ve been able to contribute and support your efforts.&lt;/p&gt; &lt;p&gt;Happy Coding!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-1312209804661150450?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VUmtYRj3fNk673wNWQE-I46TlfU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VUmtYRj3fNk673wNWQE-I46TlfU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VUmtYRj3fNk673wNWQE-I46TlfU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VUmtYRj3fNk673wNWQE-I46TlfU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=CWxsiHqPTeU:c8oY2rKZipE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=CWxsiHqPTeU:c8oY2rKZipE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=CWxsiHqPTeU:c8oY2rKZipE:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=CWxsiHqPTeU:c8oY2rKZipE:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=CWxsiHqPTeU:c8oY2rKZipE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=CWxsiHqPTeU:c8oY2rKZipE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=CWxsiHqPTeU:c8oY2rKZipE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=CWxsiHqPTeU:c8oY2rKZipE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=CWxsiHqPTeU:c8oY2rKZipE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=CWxsiHqPTeU:c8oY2rKZipE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=CWxsiHqPTeU:c8oY2rKZipE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=CWxsiHqPTeU:c8oY2rKZipE:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/CWxsiHqPTeU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/1312209804661150450/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/04/it-takes-village.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/1312209804661150450?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/1312209804661150450?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/CWxsiHqPTeU/it-takes-village.html" title="It Takes a Village…" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/04/it-takes-village.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUARHY_fSp7ImA9WxVaEk8.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-7674045942817671712</id><published>2009-04-08T16:24:00.001-04:00</published><updated>2009-04-08T16:24:05.845-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-08T16:24:05.845-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Agile" /><title>MockupScreens 4.0 Just Went RTM</title><content type="html">&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:1e62188c-582a-4433-bdf6-023d159db146" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/MockupScreens" rel="tag"&gt;MockupScreens&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Wireframes" rel="tag"&gt;Wireframes&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Prototyping" rel="tag"&gt;Prototyping&lt;/a&gt;&lt;/div&gt; &lt;p&gt;For working up wireframes and application screens, there aren’t many tools better than &lt;a href="http://www.mockupscreens.com/" target="_blank"&gt;MockupScreens&lt;/a&gt;.&amp;nbsp; The problems with using other tools like Visio (or even Visual Studio) is that it takes too much time.&amp;nbsp; When I’m sitting with a customer, I want to be able to crank out screens in a very fluid and frictionless manner.&lt;/p&gt; &lt;p&gt;I also don’t want the customer to think that it’s too costly to make a change. Often, when presented with something that “looks” real, they will either a) want to know when they can install it, or b) be afraid to suggest a change because of the perception that it’s too costly to change it now that “all of that code has been written.”&lt;/p&gt; &lt;p&gt;Here is the official word from the creators of MockupScreens:&lt;/p&gt; &lt;h4&gt;&lt;strong&gt;Preview Of MockupScreens 4&lt;/strong&gt;&lt;/h4&gt; &lt;p&gt;&lt;strong&gt;In short, new release does much better job&lt;/strong&gt; than the old one. For one it's much more robust, being completely redesigned and rewritten during past 14 months (wow, it went by so fast!). Other major improvements are the very same you kept requesting:  &lt;ul&gt; &lt;li&gt;Both &lt;strong&gt;much nicer and more "standard" interface&lt;/strong&gt; - single main screen, native windows controls and dialogs, etc  &lt;li&gt;Ability to &lt;strong&gt;switch look and feel at any time &lt;/strong&gt;among Black and white, Windows and Web look and feel  &lt;li&gt;Finer control of the mocked screens' &lt;strong&gt;element formatting&lt;/strong&gt;: font color, font size, bold, italic, underline, etc &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Not to keep you waiting any longer,&lt;/strong&gt; here is the screenshot so you can see by yourself what I'm talking about. You have to click on it to really see the details.&lt;br&gt;&lt;a href="http://mockupscreens.cmail4.com/t/y/l/hyalu/tjddttlyk/k"&gt;&lt;img title="Much Improved Interface And Functionality" border="0" alt="Much Improved Interface And Functionality" src="http://mockupscreens.cmail4.com/ei/y/CE/99D/EAC/mockupscreenscom/uploads/images/newsletter/new_interface_small.jpg" width="550" height="343"&gt;&lt;/a&gt;&lt;br&gt;(If you can't see the image, your e-mail program is blocking it. Open it &lt;a href="http://mockupscreens.cmail4.com/t/y/l/hyalu/tjddttlyk/u"&gt;here&lt;/a&gt;) &lt;br&gt;&lt;strong&gt;And below is the same mockup&lt;/strong&gt; displayed in two skins: "Windows" and "Black and white". Again, click on it to see the details.&lt;br&gt;&lt;a href="http://mockupscreens.cmail4.com/t/y/l/hyalu/tjddttlyk/o"&gt;&lt;img title="Switch skins at any time among Windows, Web and Black and white" border="0" alt="Switch skins at any time among Windows, Web and Black and white" src="http://mockupscreens.cmail4.com/ei/y/CE/99D/EAC/mockupscreenscom/uploads/images/newsletter/skins_small.jpg" width="500" height="345"&gt;&lt;/a&gt;&lt;br&gt;(If you can't see the image, your e-mail program is blocking it. Open it &lt;a href="http://mockupscreens.cmail4.com/t/y/l/hyalu/tjddttlyk/b"&gt;here&lt;/a&gt;) &lt;br&gt;Among great many other improvements&lt;strong&gt;,&lt;/strong&gt; below are those that had also been much requested by you:  &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Jump to another screen from any element&lt;/strong&gt; while in slideshow mode or in exported HTML, and not just from "mark" icons  &lt;li&gt;&lt;strong&gt;Comments for any element&lt;/strong&gt; (instead of having to put "mark" icons to comment something), along with comments being more prominent as important part of the Mockup Screens functionality, and with many small improvements in comments' exporting, printing, word-wrapping, the way how comments are displayed on screen, etc  &lt;li&gt;&lt;strong&gt;Improved "table editor"&lt;/strong&gt; so you can draw and populate your tables more easily, and even paste the actual data from Excel  &lt;li&gt;&lt;strong&gt;Printing from MockupScreens directly&lt;/strong&gt;, instead of exporting project to HTML so it could be printed  &lt;li&gt;&lt;strong&gt;Copying screen snapshots directly to Word&lt;/strong&gt; (or other programs), with no need to export snapshots to image files first  &lt;li&gt;&lt;strong&gt;Importing and exporting&lt;/strong&gt; whole scenarios or just copy-pasting them between different projects  &lt;li&gt;&lt;strong&gt;Better performance&lt;/strong&gt;, especially with large files with many screens crowded with elements  &lt;li&gt;&lt;strong&gt;Export to XML&lt;/strong&gt; so the mockups can be transformed by xsl-transformations to actual programming code  &lt;li&gt;&lt;strong&gt;Most elements can be shown as "disabled"&lt;/strong&gt;, to indicate that they are read only for example  &lt;li&gt;&lt;strong&gt;Simple file locking mechanism&lt;/strong&gt;, for people that use MockupScreens in teams often working on the same file  &lt;li&gt;&lt;strong&gt;Ability to resize working panes&lt;/strong&gt; to accommodate people with different&amp;nbsp; display size and resolution&lt;/li&gt;&lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-7674045942817671712?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/a3tfSg__nLxHokfMHzGBQDh6AZE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/a3tfSg__nLxHokfMHzGBQDh6AZE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/a3tfSg__nLxHokfMHzGBQDh6AZE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/a3tfSg__nLxHokfMHzGBQDh6AZE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=IgKkd5sPJoI:Gs6bGNIUO0Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=IgKkd5sPJoI:Gs6bGNIUO0Y:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=IgKkd5sPJoI:Gs6bGNIUO0Y:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=IgKkd5sPJoI:Gs6bGNIUO0Y:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=IgKkd5sPJoI:Gs6bGNIUO0Y:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=IgKkd5sPJoI:Gs6bGNIUO0Y:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=IgKkd5sPJoI:Gs6bGNIUO0Y:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=IgKkd5sPJoI:Gs6bGNIUO0Y:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=IgKkd5sPJoI:Gs6bGNIUO0Y:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=IgKkd5sPJoI:Gs6bGNIUO0Y:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=IgKkd5sPJoI:Gs6bGNIUO0Y:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=IgKkd5sPJoI:Gs6bGNIUO0Y:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/IgKkd5sPJoI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/7674045942817671712/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/04/mockupscreens-40-just-went-rtm.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/7674045942817671712?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/7674045942817671712?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/IgKkd5sPJoI/mockupscreens-40-just-went-rtm.html" title="MockupScreens 4.0 Just Went RTM" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/04/mockupscreens-40-just-went-rtm.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUCSH0_fCp7ImA9WxVaEkw.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-6337468930463481031</id><published>2009-04-08T14:44:00.001-04:00</published><updated>2009-04-08T14:44:29.344-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-08T14:44:29.344-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ReSharper" /><category scheme="http://www.blogger.com/atom/ns#" term="R#" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><title>ReSharper 4.5 Goes RTM</title><content type="html">&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:372e6ede-3a54-49dd-9419-4b9aefd8d7a7" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/ReSharper" rel="tag"&gt;ReSharper&lt;/a&gt;,&lt;a href="http://technorati.com/tags/R%23" rel="tag"&gt;R#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;&lt;/div&gt; &lt;p&gt;It’s here!&amp;nbsp; I’ve been using the daily downloads from the EAP site for a while now, and have been extremely happy with the improved performance.&lt;/p&gt; &lt;p&gt;Run, don’t walk, and download it &lt;a href="http://www.jetbrains.com/resharper/download/" target="_blank"&gt;here&lt;/a&gt;!&lt;/p&gt; &lt;p&gt;Happy Coding!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-6337468930463481031?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LJT3_2SkoKu31CguQKRFa1Z_kMA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LJT3_2SkoKu31CguQKRFa1Z_kMA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LJT3_2SkoKu31CguQKRFa1Z_kMA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LJT3_2SkoKu31CguQKRFa1Z_kMA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=3tKMJVlvOkI:9bx7_p5rqxY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=3tKMJVlvOkI:9bx7_p5rqxY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=3tKMJVlvOkI:9bx7_p5rqxY:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=3tKMJVlvOkI:9bx7_p5rqxY:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=3tKMJVlvOkI:9bx7_p5rqxY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=3tKMJVlvOkI:9bx7_p5rqxY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=3tKMJVlvOkI:9bx7_p5rqxY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=3tKMJVlvOkI:9bx7_p5rqxY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=3tKMJVlvOkI:9bx7_p5rqxY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=3tKMJVlvOkI:9bx7_p5rqxY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=3tKMJVlvOkI:9bx7_p5rqxY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=3tKMJVlvOkI:9bx7_p5rqxY:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/3tKMJVlvOkI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/6337468930463481031/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/04/resharper-45-goes-rtm.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/6337468930463481031?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/6337468930463481031?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/3tKMJVlvOkI/resharper-45-goes-rtm.html" title="ReSharper 4.5 Goes RTM" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/04/resharper-45-goes-rtm.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QMQHc5fSp7ImA9WxVaEkw.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-3021064466729432111</id><published>2009-04-08T13:22:00.001-04:00</published><updated>2009-04-08T13:23:01.925-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-08T13:23:01.925-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VSLive" /><category scheme="http://www.blogger.com/atom/ns#" term="Speaking" /><category scheme="http://www.blogger.com/atom/ns#" term="Scrum" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><title>VSLive Vegas 2009 Discount Code Still Available</title><content type="html">&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:224b281f-6e19-4e1e-9bf9-5d1bbf657550" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/VSLive" rel="tag"&gt;VSLive&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Conferences" rel="tag"&gt;Conferences&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/.NET" rel="tag"&gt;.NET&lt;/a&gt;&lt;/div&gt; &lt;p&gt;Now that I have your attention, a little background. I have attended VSLive conferences for over 10 years, and more recently became a speaker for them.&amp;nbsp; In June, I’ll be speaking at &lt;a href="http://www.vslive.com" target="_blank"&gt;VSLive&lt;/a&gt; in Las Vegas, NV. in the Agile/Design Track on &lt;a href="http://vslive.com/2009/lasvegas/agile_design.aspx" target="_blank"&gt;Development Patterns&lt;/a&gt; and &lt;a href="http://vslive.com/2009/lasvegas/agile_design.aspx" target="_blank"&gt;Enterprise Agility&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;In a post that I wrote in &lt;a href="http://japikse.blogspot.com/2008/09/what-makes-youme-better-developer.html" target="_blank"&gt;September, 2009&lt;/a&gt;, I discussed what makes me a better developer, and I want to revisit some of that now.&amp;nbsp; In that post I discussed three aspects:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Community,&lt;/li&gt; &lt;li&gt;Don’t be the smartest person in the room,&lt;/li&gt; &lt;li&gt;Attend a national conference.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;I live in the Heartland District (Ohio, Michigan, Kentucky, and Tennessee), and we are fortunate to have developer events all the time.&amp;nbsp; Whether it’s the larger events like &lt;a href="http://cinnug.org/cododn/default.aspx" target="_blank"&gt;Central Ohio Day of .NET&lt;/a&gt;, &lt;a href="http://www.codemash.org/" target="_blank"&gt;CodeMash&lt;/a&gt;, &lt;a href="http://www.codestock.org/" target="_blank"&gt;CodeStock&lt;/a&gt;, and &lt;a href="http://www.devlink.net/" target="_blank"&gt;DevLink&lt;/a&gt;, or the smaller events like &lt;a href="http://dodn.org/WestMichiganDotNetU/" target="_blank"&gt;West MI .NET University&lt;/a&gt; or &lt;a href="http://www.kalamazoox.org/" target="_blank"&gt;KalamazooX&lt;/a&gt; (and all of the other Day of .NETs and code camps occurring throughout the district), we have a terrific code of speakers and organizers that are very passionate about the development community.&lt;/p&gt; &lt;p&gt;With all of these regional events, why go to a national conference like VSLive?&amp;nbsp; There are several reasons, but the main one that I go for is the range of topics presented.&amp;nbsp; I go through cycles of different technologies that I work with for various clients.&amp;nbsp; I might spend a significant amount of my time working in Smart Client, and don’t want to get completely left behind on what’s happening in Web Development (hello MVC/JQuery/Prototype/etc).&amp;nbsp; My first real exposure to WPF was at a VSLive.&amp;nbsp; There’s just too much in the .NET FW to keep current on everything.&lt;/p&gt; &lt;p&gt;VSLive will help you keep current on all of the different aspects of development, and provide the opportunity to dig deeper into your topics of interest.&amp;nbsp; So, does that intrigue you enough yet?&amp;nbsp; How about a $400 discount on an all access pass to the conference?&amp;nbsp; Use the following code when you register, and you will get the Passport Package for just $1,295.&amp;nbsp; You can get more conference information and register at &lt;a href="http://vslive.com/2009/lasvegas/"&gt;http://vslive.com/2009/lasvegas/&lt;/a&gt;.&amp;nbsp; The discount code is (drum roll please):&lt;/p&gt; &lt;h4&gt;&lt;font color="#ff0000"&gt;S9V13&lt;/font&gt;&lt;/h4&gt; &lt;p&gt;Between the regional events and attending at least one national event a year, it’s &lt;em&gt;easy&lt;/em&gt; to surround yourself with people smarter than yourself.&amp;nbsp; I love being the least smart person in the room.&amp;nbsp; That means all I can do is learn!&lt;/p&gt; &lt;p&gt;I hope to see you there, and as always, Happy Coding!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-3021064466729432111?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GTH7OePnhnu_rebVEn3J0_JvqCw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GTH7OePnhnu_rebVEn3J0_JvqCw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/GTH7OePnhnu_rebVEn3J0_JvqCw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GTH7OePnhnu_rebVEn3J0_JvqCw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=QKK1VYaQIP0:lkgxP4E9jGM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=QKK1VYaQIP0:lkgxP4E9jGM:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=QKK1VYaQIP0:lkgxP4E9jGM:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=QKK1VYaQIP0:lkgxP4E9jGM:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=QKK1VYaQIP0:lkgxP4E9jGM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=QKK1VYaQIP0:lkgxP4E9jGM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=QKK1VYaQIP0:lkgxP4E9jGM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=QKK1VYaQIP0:lkgxP4E9jGM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=QKK1VYaQIP0:lkgxP4E9jGM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=QKK1VYaQIP0:lkgxP4E9jGM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=QKK1VYaQIP0:lkgxP4E9jGM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=QKK1VYaQIP0:lkgxP4E9jGM:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/QKK1VYaQIP0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/3021064466729432111/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/04/vslive-vegas-2009-discount-code-still.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/3021064466729432111?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/3021064466729432111?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/QKK1VYaQIP0/vslive-vegas-2009-discount-code-still.html" title="VSLive Vegas 2009 Discount Code Still Available" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/04/vslive-vegas-2009-discount-code-still.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ANQH46fSp7ImA9WxVaEE4.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-2314402909805320185</id><published>2009-04-06T12:36:00.001-04:00</published><updated>2009-04-06T12:36:31.015-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-06T12:36:31.015-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VMWare" /><category scheme="http://www.blogger.com/atom/ns#" term="R#" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><title>ReSharper Import Symbol (aka Type Name) Completion and VMWare Console</title><content type="html">&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:321f0ecb-e385-4a85-86d0-b20194068461" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/ReSharper" rel="tag"&gt;ReSharper&lt;/a&gt;,&lt;a href="http://technorati.com/tags/VMWare+Server" rel="tag"&gt;VMWare Server&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Import+Symbol+Completion" rel="tag"&gt;Import Symbol Completion&lt;/a&gt;&lt;/div&gt; &lt;p&gt;ReSharper (R#) has a great feature that will complete the type (and add the correct “using” statement) for any referenced assembly regardless of current visibility in your class.&lt;/p&gt; &lt;p&gt;The default keystrokes for this is ctl-alt-space.&amp;nbsp; This works great, but stopped working for me when I started running everything in a Virtual Machine Console window.&amp;nbsp; I thought (for too long) that it was an issue with the daily builds, but it occurred to me that it is really a side effect of running in VMWare Server console.&amp;nbsp; The console window maps ctl-alt to “release your cursor”.&amp;nbsp; The prevents programs running in the VM from using that keystroke combination.&lt;/p&gt; &lt;p&gt;The solution was simple.&amp;nbsp; In Visual Studio, goto Tools-&amp;gt;Options-&amp;gt;Keyboard.&amp;nbsp; In the textbox for “Show commands containing:”, type “CompleteCodeTypeName”, and two options will show.&amp;nbsp; Select the choice “ReSharper.ReSharper_CompleteCodeTypeName” and map it to something else (I selected ctl-shift-alt-space) and viola, it works again!&lt;/p&gt; &lt;p&gt;Happy Coding!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-2314402909805320185?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EVOUPHwDIGPZlz34ByQa5wIPgLM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EVOUPHwDIGPZlz34ByQa5wIPgLM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EVOUPHwDIGPZlz34ByQa5wIPgLM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EVOUPHwDIGPZlz34ByQa5wIPgLM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=5TrKfS2fOpA:TA8L30zDyaE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=5TrKfS2fOpA:TA8L30zDyaE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=5TrKfS2fOpA:TA8L30zDyaE:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=5TrKfS2fOpA:TA8L30zDyaE:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=5TrKfS2fOpA:TA8L30zDyaE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=5TrKfS2fOpA:TA8L30zDyaE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=5TrKfS2fOpA:TA8L30zDyaE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=5TrKfS2fOpA:TA8L30zDyaE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=5TrKfS2fOpA:TA8L30zDyaE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=5TrKfS2fOpA:TA8L30zDyaE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=5TrKfS2fOpA:TA8L30zDyaE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=5TrKfS2fOpA:TA8L30zDyaE:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/5TrKfS2fOpA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/2314402909805320185/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/04/resharper-import-symbol-aka-type-name.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/2314402909805320185?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/2314402909805320185?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/5TrKfS2fOpA/resharper-import-symbol-aka-type-name.html" title="ReSharper Import Symbol (aka Type Name) Completion and VMWare Console" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/04/resharper-import-symbol-aka-type-name.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcAR3o8fyp7ImA9WxVbGEo.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-5908376548143103040</id><published>2009-04-04T15:24:00.001-04:00</published><updated>2009-04-04T15:24:06.477-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-04T15:24:06.477-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WPF" /><category scheme="http://www.blogger.com/atom/ns#" term="Unit Testing" /><category scheme="http://www.blogger.com/atom/ns#" term="Speaking" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><category scheme="http://www.blogger.com/atom/ns#" term="TDD" /><title>West Michigan .NET University Slides and Code</title><content type="html">&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:176239b5-2cf8-4887-ad34-4d2a995b71c9" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/TDD" rel="tag"&gt;TDD&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Unit+Testing+.Net" rel="tag"&gt;Unit Testing .Net&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/West+Michigan+.NET+University" rel="tag"&gt;West Michigan .NET University&lt;/a&gt;&lt;/div&gt; &lt;p&gt;I have just finished both of my talks at West Michigan .NET University, and the feedback was overwhelmingly positive.&amp;nbsp; There are a great bunch of attendees here, and we have had great discussions today!&lt;/p&gt; &lt;p&gt;I’ve had several folks asking me for the slides, and for once I’m getting it posted in a timely manner!&amp;nbsp; Here are the slides for &lt;a href="http://skimedic.googlepages.com/WMNU2009_JapikseEffectiveUnitTesting.pdf" target="_blank"&gt;Effective Unit Testing&lt;/a&gt; and my joint presentation with Cary Payette on &lt;a href="http://skimedic.googlepages.com/WMNU2009_JapiksePayetteWPF.pdf" target="_blank"&gt;Introduction to Windows Presentation Foundation&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The source code for my WPF demo is located &lt;a href="http://skimedic.googlepages.com/WMNU_WPFCode.zip" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Happy Coding!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-5908376548143103040?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OOAkY2GAyN4sXle0OvYBvckAoVI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OOAkY2GAyN4sXle0OvYBvckAoVI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/OOAkY2GAyN4sXle0OvYBvckAoVI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OOAkY2GAyN4sXle0OvYBvckAoVI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=wyI9x1K5xdQ:jqt8-QTIEmc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=wyI9x1K5xdQ:jqt8-QTIEmc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=wyI9x1K5xdQ:jqt8-QTIEmc:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=wyI9x1K5xdQ:jqt8-QTIEmc:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=wyI9x1K5xdQ:jqt8-QTIEmc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=wyI9x1K5xdQ:jqt8-QTIEmc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=wyI9x1K5xdQ:jqt8-QTIEmc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=wyI9x1K5xdQ:jqt8-QTIEmc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=wyI9x1K5xdQ:jqt8-QTIEmc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=wyI9x1K5xdQ:jqt8-QTIEmc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=wyI9x1K5xdQ:jqt8-QTIEmc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=wyI9x1K5xdQ:jqt8-QTIEmc:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/wyI9x1K5xdQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/5908376548143103040/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/04/west-michigan-net-university-slides-and.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/5908376548143103040?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/5908376548143103040?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/wyI9x1K5xdQ/west-michigan-net-university-slides-and.html" title="West Michigan .NET University Slides and Code" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/04/west-michigan-net-university-slides-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcCQ3sycCp7ImA9WxVbEko.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-5485654568100126627</id><published>2009-03-28T13:03:00.001-04:00</published><updated>2009-03-28T15:54:22.598-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-28T15:54:22.598-04:00</app:edited><title>Cincinnati Object Relational Mapping (ORM) Firestarter</title><content type="html">&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:426bf4a5-3aa1-4d08-848d-c7790850b697" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/NHibernate" rel="tag"&gt;NHibernate&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Entity+Framework" rel="tag"&gt;Entity Framework&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Firestarter" rel="tag"&gt;Firestarter&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Cincinnati+.NET+Users" rel="tag"&gt;Cincinnati .NET Users' Group&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ORM" rel="tag"&gt;ORM&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;What is an ORM (you ask)? Then this event is perfect for you!&lt;/p&gt;&lt;p&gt;What is a Firestarter event (you ask)? The Firestarters are meant to serve as an entry point into a technology (or technologies). So, for this event, we assume you know nothing about ORMs. Should you come if you have been using NHibernate or Entity Framework? ABSOLUTELY!&lt;/p&gt;&lt;p&gt;We are well into the planning stages for the Cincinnati ORM Firestarter, sponsored by the &lt;a href="http://www.cinnug.org/"&gt;Cincinnati .NET Users’ Group&lt;/a&gt; (CINNUG) and hosted at the Microsoft Offices in Mason on June 13, 2009.&lt;/p&gt;&lt;p&gt;Although we are starting at the beginning with both NH and EF, the presenters will be working up a real application with the different tools so you can see how they work, how they are different, and why you should use one particular tool over the other.&lt;/p&gt;&lt;p&gt;An amazing group of speakers have come forward to help me out (bios coming soon), and as a team we’ve come up with the following lineup:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;ORM Architectural Overview&lt;br /&gt;&lt;li&gt;NHibernate 101&lt;br /&gt;&lt;li&gt;Fluent NHibernate and Structure Map&lt;br /&gt;&lt;li&gt;Castle Active Record&lt;br /&gt;&lt;li&gt;LINQ to SQL and Entity Framework 101&lt;br /&gt;&lt;li&gt;Applied Entity Framework &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;Keep a close eye on this blog post, &lt;a href="http://www.cinnug.org/"&gt;CINNUG&lt;/a&gt;, and &lt;a href="http://www.startafire.net/firestarter/"&gt;Start A Fire&lt;/a&gt;. More information will be coming soon!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;In the meantime, Happy Coding!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-5485654568100126627?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Q-3MylcMfUwKUski3S9UPSN_MZU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Q-3MylcMfUwKUski3S9UPSN_MZU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Q-3MylcMfUwKUski3S9UPSN_MZU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Q-3MylcMfUwKUski3S9UPSN_MZU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=wJd7xqNmtaU:_zwjUdng2pM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=wJd7xqNmtaU:_zwjUdng2pM:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=wJd7xqNmtaU:_zwjUdng2pM:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=wJd7xqNmtaU:_zwjUdng2pM:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=wJd7xqNmtaU:_zwjUdng2pM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=wJd7xqNmtaU:_zwjUdng2pM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=wJd7xqNmtaU:_zwjUdng2pM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=wJd7xqNmtaU:_zwjUdng2pM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=wJd7xqNmtaU:_zwjUdng2pM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=wJd7xqNmtaU:_zwjUdng2pM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=wJd7xqNmtaU:_zwjUdng2pM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=wJd7xqNmtaU:_zwjUdng2pM:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/wJd7xqNmtaU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/5485654568100126627/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/03/cincinnati-object-relational-mapping.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/5485654568100126627?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/5485654568100126627?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/wJd7xqNmtaU/cincinnati-object-relational-mapping.html" title="Cincinnati Object Relational Mapping (ORM) Firestarter" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/03/cincinnati-object-relational-mapping.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUFQHo-fSp7ImA9WxVbEEU.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-3280170492110955654</id><published>2009-03-26T11:10:00.001-04:00</published><updated>2009-03-26T11:10:11.455-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-26T11:10:11.455-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Unit Testing" /><category scheme="http://www.blogger.com/atom/ns#" term="Speaking" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><category scheme="http://www.blogger.com/atom/ns#" term="TDD" /><title>Come on out to Kalamazoo…X?</title><content type="html">&lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:81c798f3-e842-4ac1-b77e-c16d4a6bb58d" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/KalamazooX" rel="tag"&gt;KalamazooX&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Test+Driven+Development" rel="tag"&gt;Test Driven Development&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Unit+Testing+.Net" rel="tag"&gt;Unit Testing .Net&lt;/a&gt;&lt;/div&gt; &lt;p&gt;Since when did Kalamazoo get spelled with an X? Well, when it hosts a conference focusing on the humans in IT!&amp;nbsp; This one day conference on April 25 in Kalamazoo, MI will host sessions on &lt;/p&gt; &lt;ul&gt; &lt;li&gt;Human Interaction&lt;/li&gt; &lt;li&gt;Interface and Graphic Design&lt;/li&gt; &lt;li&gt;Development Processes&lt;/li&gt; &lt;li&gt;Application Lifecycle Management&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;I will be speaking on Effective Unit Testing leading to Test Driven, and I hope to see you there!&lt;/p&gt; &lt;p&gt;More information can be found at &lt;a href="http://www.kalamazoox.org"&gt;www.kalamazoox.org&lt;/a&gt;,&amp;nbsp; including registration details.&lt;/p&gt; &lt;p&gt;Happy Coding!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-3280170492110955654?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/iosz5Y_QaYsDU-ucY1Jdwo1eSy4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iosz5Y_QaYsDU-ucY1Jdwo1eSy4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/iosz5Y_QaYsDU-ucY1Jdwo1eSy4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iosz5Y_QaYsDU-ucY1Jdwo1eSy4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=kzqpwWGh7_w:GVOafL_yVzQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=kzqpwWGh7_w:GVOafL_yVzQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=kzqpwWGh7_w:GVOafL_yVzQ:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=kzqpwWGh7_w:GVOafL_yVzQ:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=kzqpwWGh7_w:GVOafL_yVzQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=kzqpwWGh7_w:GVOafL_yVzQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=kzqpwWGh7_w:GVOafL_yVzQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=kzqpwWGh7_w:GVOafL_yVzQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=kzqpwWGh7_w:GVOafL_yVzQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=kzqpwWGh7_w:GVOafL_yVzQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=kzqpwWGh7_w:GVOafL_yVzQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=kzqpwWGh7_w:GVOafL_yVzQ:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/kzqpwWGh7_w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/3280170492110955654/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/03/come-on-out-to-kalamazoox.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/3280170492110955654?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/3280170492110955654?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/kzqpwWGh7_w/come-on-out-to-kalamazoox.html" title="Come on out to Kalamazoo…X?" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/03/come-on-out-to-kalamazoox.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MFQX06cSp7ImA9WxVbEEo.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-5459998463747187970</id><published>2009-03-26T10:56:00.001-04:00</published><updated>2009-03-26T10:56:50.319-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-26T10:56:50.319-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Dayton .Net Users Group" /><category scheme="http://www.blogger.com/atom/ns#" term="Speaking" /><category scheme="http://www.blogger.com/atom/ns#" term="Cincinnati .Net Users Group" /><category scheme="http://www.blogger.com/atom/ns#" term="Cincinnati SQL Server Users Group" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><category scheme="http://www.blogger.com/atom/ns#" term="TDD" /><title>Central Ohio Day of .NET is Coming April 18</title><content type="html">&lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:406c4ece-7256-4a30-9c03-9ddbef0da2a7" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Central+Ohio+Day+of+.NET" rel="tag"&gt;Central Ohio Day of .NET&lt;/a&gt;,&lt;a href="http://technorati.com/tags/T-SQL+TDD" rel="tag"&gt;T-SQL TDD&lt;/a&gt;&lt;/div&gt; &lt;p&gt;Once again I will be speaking at the &lt;a href="http://cinnug.org/cododn/default.aspx"&gt;Central Ohio Day of .NET&lt;/a&gt;. What is it?&amp;nbsp; And Why Central Ohio?&amp;nbsp; Well, I’m glad you asked!&lt;/p&gt; &lt;p&gt;CODODN is a combined effort of the &lt;a href="http://cinnug.org"&gt;Cincinnati .NET Users’ Group (CINNUG)&lt;/a&gt;, &lt;a href="http://www.cincysql.org/"&gt;Cincinnati SQL Server and Business Intelligence Users’ Group (CincySQL)&lt;/a&gt;, &lt;a href="http://www.daytondevgroup.net/"&gt;Dayton .NET Developers’ Group&lt;/a&gt;, and the &lt;a href="http://condg.org/"&gt;Central Ohio .NET Developers’ Group&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;From this amazing pool of talent, there will be sessions presented on Architecture, Testing, SQL Server, well, just check the list out for yourself &lt;a href="http://cinnug.org/cododn/sessions.aspx"&gt;here&lt;/a&gt;!&lt;/p&gt; &lt;p&gt;I will be speaking on Test Driven Development in T-SQL, registration is open (go &lt;a href="https://www.clicktoattend.com/invitation.aspx?code=136826"&gt;here&lt;/a&gt;).&amp;nbsp; I hope to see you there!&lt;/p&gt; &lt;p&gt;Happy coding!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-5459998463747187970?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hkaRkdbsvBtd8xPUvU5bY4a7eSg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hkaRkdbsvBtd8xPUvU5bY4a7eSg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hkaRkdbsvBtd8xPUvU5bY4a7eSg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hkaRkdbsvBtd8xPUvU5bY4a7eSg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=0KfeTm87dDU:qgJQ3Z9PJMk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=0KfeTm87dDU:qgJQ3Z9PJMk:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=0KfeTm87dDU:qgJQ3Z9PJMk:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=0KfeTm87dDU:qgJQ3Z9PJMk:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=0KfeTm87dDU:qgJQ3Z9PJMk:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=0KfeTm87dDU:qgJQ3Z9PJMk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=0KfeTm87dDU:qgJQ3Z9PJMk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=0KfeTm87dDU:qgJQ3Z9PJMk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=0KfeTm87dDU:qgJQ3Z9PJMk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=0KfeTm87dDU:qgJQ3Z9PJMk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=0KfeTm87dDU:qgJQ3Z9PJMk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=0KfeTm87dDU:qgJQ3Z9PJMk:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/0KfeTm87dDU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/5459998463747187970/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/03/central-ohio-day-of-net-is-coming-april.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/5459998463747187970?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/5459998463747187970?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/0KfeTm87dDU/central-ohio-day-of-net-is-coming-april.html" title="Central Ohio Day of .NET is Coming April 18" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/03/central-ohio-day-of-net-is-coming-april.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4DQ3w4fCp7ImA9WxVbEEo.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-6504936997047652353</id><published>2009-03-26T10:30:00.001-04:00</published><updated>2009-03-26T10:32:52.234-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-26T10:32:52.234-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WPF" /><category scheme="http://www.blogger.com/atom/ns#" term="Unit Testing" /><category scheme="http://www.blogger.com/atom/ns#" term="XAML" /><category scheme="http://www.blogger.com/atom/ns#" term="VS2008" /><category scheme="http://www.blogger.com/atom/ns#" term="Architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="Speaking" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><category scheme="http://www.blogger.com/atom/ns#" term="TDD" /><title>West Michigan .NET University is coming April 4</title><content type="html">&lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:eeb25219-2585-4bed-8b72-aa3ea2678c80" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/.Net" rel="tag"&gt;.Net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/TDD" rel="tag"&gt;TDD&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Unit+Testing+.Net" rel="tag"&gt;Unit Testing .Net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Conferences" rel="tag"&gt;Conferences&lt;/a&gt;,&lt;a href="http://technorati.com/tags/West+Michigan+.NET+University" rel="tag"&gt;West Michigan .NET University&lt;/a&gt;&lt;/div&gt; &lt;p&gt;What is a .NET University?&amp;nbsp; Well, first of all, it’s FREE!&amp;nbsp; Secondly, it’s a one day conference given by members of the development community for the development community.&lt;/p&gt; &lt;p&gt;Are you new to .NET?&amp;nbsp; Or are you new to some part of .NET, like WPF? or Sharepoint?Maybe you’ve been hearing all about this Test Driven Development thing, and need more information? Or you just need to get better at Unit Testing?&lt;/p&gt; &lt;p&gt;We have a very talented group of outstanding speakers presenting on:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;.NET Boot camp and Intermediate .NET (whole day)&lt;/li&gt; &lt;li&gt;ASP.NET/Ajax and Intermediate Web Development (whole day)&lt;/li&gt; &lt;li&gt;Real World Architecture&lt;/li&gt; &lt;li&gt;Windows Presentation Foundation&lt;/li&gt; &lt;li&gt;SQL Server Data Models and T-SQL&lt;/li&gt; &lt;li&gt;Sharepoint&lt;/li&gt; &lt;li&gt;Web Services/Windows Communication Foundation&lt;/li&gt; &lt;li&gt;Silverlight&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;The format of the .NET University is longer sessions (3 hours), with some of them running essentially the entire day.&amp;nbsp; So no constants switching rooms/speakers.&amp;nbsp; Also, the sessions are long enough that the law of two feet can apply.&amp;nbsp; Want to see two sessions that are concurrent?&amp;nbsp; Hop back and forth, settling into the one that intrigues you the most.&lt;/p&gt; &lt;p&gt;You can register for the event &lt;a href="http://www.dayofdotnet.org/WestMichiganDotNetU/RegisterNow.aspx"&gt;here&lt;/a&gt;, and also get more information at the &lt;a href="http://www.dayofdotnet.org/WestMichiganDotNetU"&gt;home page&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;I will be speaking in the morning with &lt;a href="http://codingbandit.com/blog/"&gt;Carey Payette&lt;/a&gt; on Windows Presentation Foundation and in the afternoon with &lt;a href="http://geekswithblogs.net/ignu"&gt;Len Smith&lt;/a&gt; on Effective Unit Testing and Test Driven Development.&amp;nbsp; I hope to see you there!&lt;/p&gt; &lt;p&gt;Happy Coding!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-6504936997047652353?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Lm5sG4qRNBfMPKCEZ_MrjluIx-w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Lm5sG4qRNBfMPKCEZ_MrjluIx-w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Lm5sG4qRNBfMPKCEZ_MrjluIx-w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Lm5sG4qRNBfMPKCEZ_MrjluIx-w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=STS7Q2A3UXc:lqhS6iJ2lfE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=STS7Q2A3UXc:lqhS6iJ2lfE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=STS7Q2A3UXc:lqhS6iJ2lfE:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=STS7Q2A3UXc:lqhS6iJ2lfE:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=STS7Q2A3UXc:lqhS6iJ2lfE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=STS7Q2A3UXc:lqhS6iJ2lfE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=STS7Q2A3UXc:lqhS6iJ2lfE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=STS7Q2A3UXc:lqhS6iJ2lfE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=STS7Q2A3UXc:lqhS6iJ2lfE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=STS7Q2A3UXc:lqhS6iJ2lfE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=STS7Q2A3UXc:lqhS6iJ2lfE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=STS7Q2A3UXc:lqhS6iJ2lfE:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/STS7Q2A3UXc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/6504936997047652353/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/03/west-michigan-net-university-is-coming.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/6504936997047652353?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/6504936997047652353?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/STS7Q2A3UXc/west-michigan-net-university-is-coming.html" title="West Michigan .NET University is coming April 4" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/03/west-michigan-net-university-is-coming.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIARn46cCp7ImA9WxVbEEo.&quot;"><id>tag:blogger.com,1999:blog-6281802642252625048.post-9006586691166592877</id><published>2009-03-26T10:09:00.001-04:00</published><updated>2009-03-26T10:09:07.018-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-26T10:09:07.018-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Unit Testing" /><category scheme="http://www.blogger.com/atom/ns#" term="Gallio" /><category scheme="http://www.blogger.com/atom/ns#" term="MbUnit" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><title>Gallio and MbUnit 3.0.6 RTM!</title><content type="html">&lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:14b69ca4-55aa-469a-a702-db1c68ec2e3e" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/MbUnit" rel="tag"&gt;MbUnit&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Gallio" rel="tag"&gt;Gallio&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Unit+Testing+.Net" rel="tag"&gt;Unit Testing .Net&lt;/a&gt;&lt;/div&gt; &lt;p&gt;The folks at Gallio and MbUnit (led by &lt;a href="http://blog.bits-in-motion.com"&gt;Jeff Brown&lt;/a&gt;) have done a fantastic job with the latest release of Gallio and MbUnit.&amp;nbsp; Lots of new features including ReSharper 4.5 integration (w00t!), Parallelizable tests, more control over time outs, updated contract verifiers, XML Data sources, and more!&lt;/p&gt; &lt;p&gt;Check out all the juicy details &lt;a href="http://blog.bits-in-motion.com/2009/03/announcing-gallio-and-mbunit-v306.html"&gt;here&lt;/a&gt;, and enjoy the new framework.&lt;/p&gt; &lt;p&gt;Happy coding!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6281802642252625048-9006586691166592877?l=japikse.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/j5AsdSgG3s8Ens9WmXPeRyV2mOA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/j5AsdSgG3s8Ens9WmXPeRyV2mOA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/j5AsdSgG3s8Ens9WmXPeRyV2mOA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/j5AsdSgG3s8Ens9WmXPeRyV2mOA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/japikse?a=BKXr_3gSnuA:ONtYukhyoCo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=BKXr_3gSnuA:ONtYukhyoCo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=BKXr_3gSnuA:ONtYukhyoCo:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=BKXr_3gSnuA:ONtYukhyoCo:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=BKXr_3gSnuA:ONtYukhyoCo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=BKXr_3gSnuA:ONtYukhyoCo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=BKXr_3gSnuA:ONtYukhyoCo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=BKXr_3gSnuA:ONtYukhyoCo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=BKXr_3gSnuA:ONtYukhyoCo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?i=BKXr_3gSnuA:ONtYukhyoCo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=BKXr_3gSnuA:ONtYukhyoCo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/japikse?a=BKXr_3gSnuA:ONtYukhyoCo:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/japikse?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/japikse/~4/BKXr_3gSnuA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://japikse.blogspot.com/feeds/9006586691166592877/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://japikse.blogspot.com/2009/03/gallio-and-mbunit-306-rtm.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/9006586691166592877?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6281802642252625048/posts/default/9006586691166592877?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/japikse/~3/BKXr_3gSnuA/gallio-and-mbunit-306-rtm.html" title="Gallio and MbUnit 3.0.6 RTM!" /><author><name>Philip Japikse, MVP, MCSD, MCDBA, CSM, CSP</name><uri>http://www.blogger.com/profile/16155396187417878040</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/_byyhrRXCSAk/SK7X4CUE4CI/AAAAAAAAABs/yhCU911aQT8/S220/self_81.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://japikse.blogspot.com/2009/03/gallio-and-mbunit-306-rtm.html</feedburner:origLink></entry></feed>

