<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>its coding time</title>
    <description>programming and other tech stuff by scott marlowe</description>
    <link>http://www.itscodingtime.com/itscodingtime/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.4.5.0</generator>
    <language>en-US</language>
    <blogChannel:blogRoll>http://www.itscodingtime.com/itscodingtime/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
    <dc:creator>Scott Marlowe</dc:creator>
    <dc:title>its coding time</dc:title>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ItsCodingTime" /><feedburner:info uri="itscodingtime" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/</creativeCommons:license><feedburner:emailServiceId>ItsCodingTime</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
      <title>SharePoint 2010: Reasons to use the new UI</title>
      <description>&lt;p&gt;
There are &lt;a href="https://www.google.com/webhp?rlz=1C1CHKZ_enUS433US433&amp;amp;sourceid=chrome-instant&amp;amp;ix=ieb&amp;amp;ie=UTF-8&amp;amp;ion=1#hl=en&amp;amp;cp=37&amp;amp;gs_id=3s&amp;amp;xhr=t&amp;amp;q=reasons+to+upgrade+to+sharepoint+2010&amp;amp;tok=vqBkVPnR7TEfRDJ0c5ubsw&amp;amp;pq=reasons+to+upgrade+to+sharepoint+2010%3F&amp;amp;pf=p&amp;amp;sclient=psy-ab&amp;amp;rlz=1C1CHKZ_enUS433US433&amp;amp;site=webhp&amp;amp;source=hp&amp;amp;pbx=1&amp;amp;oq=reasons+to+upgrade+to+sharepoint+2010&amp;amp;aq=0&amp;amp;aqi=g1&amp;amp;aql=&amp;amp;gs_sm=&amp;amp;gs_upl=&amp;amp;bav=on.2,or.r_gc.r_pw.r_cp.,cf.osb&amp;amp;fp=a832e4bee034e5be&amp;amp;ion=1&amp;amp;biw=1045&amp;amp;bih=907&amp;amp;bs=1"&gt;a lot of reasons&lt;/a&gt; to upgrade from SharePoint 2007 to SharePoint 2010. There are also a lot of reasons to upgrade to the new 2010 look and feel. But it&amp;rsquo;s not a requirement, and, in fact, can potentially add a lot of work to your migration effort.
&lt;/p&gt;
  
&lt;p&gt;
In order to justify this extra work to a client, I&amp;rsquo;ve compiled a list of advantages the new 2010 UI gives one over sticking with the old SP2007 look and feel. Most items come from posts listed in my &lt;a href="http://www.itscodingtime.com/post/SharePoint-2007-to-SharePoint-2010-Upgrade-Resources.aspx"&gt;SharePoint 2007 to SharePoint 2010 Upgrade Resources&lt;/a&gt; post.
&lt;/p&gt;
  
&lt;p&gt;
Here&amp;rsquo;s the list:
&lt;/p&gt;
  
&lt;ul&gt;
	   
	&lt;li&gt;explicit use of strict DOCTYPE provides better standards compliance, more consistent look and feel across SharePoint pages, and better consistency and support from a cross-browser perspective &lt;/li&gt;    
	&lt;li&gt;access to the new ribbon UI &lt;/li&gt;    
	&lt;li&gt;better general ease of use through the ribbon, menus, dialogs &lt;/li&gt;    
	&lt;li&gt;aligns better with current Office look and feel &lt;/li&gt;    
	&lt;li&gt;better use of modern CSS/HTML tags (uses div tag for layout vs. tables, for ex.) resulting in faster rendering and more maintainable pages/sites &lt;/li&gt;    
	&lt;li&gt;if not using the new 2010 interface, users will not have access to the ribbon, in-place editing of Wiki pages, interactive calendars, cannot define list relationships &lt;/li&gt;    
	&lt;li&gt;new sites created after the 2007-&amp;gt;2010 upgrade automatically default to the new 2010 interface (requiring manual change to the old look and feel each time) &lt;/li&gt;    
	&lt;li&gt;fully XHTML compliant WCAG 2.0 AA level accessibility (for the impaired) &lt;/li&gt;    
	&lt;li&gt;AJAX/Web 2.0 enhancements greatly reduce page refreshes &lt;/li&gt;    
	&lt;li&gt;in-place page editing &lt;/li&gt; 
&lt;/ul&gt;
  
&lt;p&gt;
I don&amp;rsquo;t doubt there are many more reasons, so consider this list preliminary or something to build on.
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=I7GlHZnQ7ds:OfRnFCvJxuc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=I7GlHZnQ7ds:OfRnFCvJxuc:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=I7GlHZnQ7ds:OfRnFCvJxuc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=I7GlHZnQ7ds:OfRnFCvJxuc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=I7GlHZnQ7ds:OfRnFCvJxuc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=I7GlHZnQ7ds:OfRnFCvJxuc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=I7GlHZnQ7ds:OfRnFCvJxuc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=I7GlHZnQ7ds:OfRnFCvJxuc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=I7GlHZnQ7ds:OfRnFCvJxuc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=I7GlHZnQ7ds:OfRnFCvJxuc:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsCodingTime/~4/I7GlHZnQ7ds" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ItsCodingTime/~3/I7GlHZnQ7ds/post.aspx</link>
      <author>scott.nospam@nospam.itscodingtime.com (scottmarlowe)</author>
      <comments>http://www.itscodingtime.com/itscodingtime/post/SharePoint-2010-Reasons-to-use-the-new-UI.aspx#comment</comments>
      <guid isPermaLink="false">http://www.itscodingtime.com/itscodingtime/post.aspx?id=555f32ce-57bc-4fc3-b895-b06a61caaafc</guid>
      <pubDate>Fri, 16 Dec 2011 16:00:00 -0500</pubDate>
      <category>SharePoint2010</category>
      <dc:publisher>scottmarlowe</dc:publisher>
      <pingback:server>http://www.itscodingtime.com/itscodingtime/pingback.axd</pingback:server>
      <pingback:target>http://www.itscodingtime.com/itscodingtime/post.aspx?id=555f32ce-57bc-4fc3-b895-b06a61caaafc</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.itscodingtime.com/itscodingtime/trackback.axd?id=555f32ce-57bc-4fc3-b895-b06a61caaafc</trackback:ping>
      <wfw:comment>http://www.itscodingtime.com/itscodingtime/post/SharePoint-2010-Reasons-to-use-the-new-UI.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.itscodingtime.com/itscodingtime/syndication.axd?post=555f32ce-57bc-4fc3-b895-b06a61caaafc</wfw:commentRss>
    <feedburner:origLink>http://www.itscodingtime.com/itscodingtime/post.aspx?id=555f32ce-57bc-4fc3-b895-b06a61caaafc</feedburner:origLink></item>
    <item>
      <title>SharePoint 2007 to SharePoint 2010 Upgrade Resources</title>
      <description>&lt;p&gt;
&lt;img style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 15px; display: inline; float: right" src="http://www.officience.com/wp-content/uploads/2011/06/logo_sharepoint_2010.jpg" alt="" width="286" height="57" align="right" /&gt;
&lt;/p&gt;
&lt;p&gt;
I&amp;rsquo;m currently involved in a project whose purpose is to upgrade an existing SharePoint 2007 server farm to SharePoint 2010. In order to help facilitate my part of the project, I&amp;rsquo;m going to use this post to document the relevant resources. While I&amp;rsquo;m interested in the process from start to finish, I&amp;rsquo;m only tasked with performing the &lt;a href="http://msdn.microsoft.com/en-us/library/gg454789.aspx"&gt;Visual Upgrade&lt;/a&gt; and porting some Silverlight applications and relevant other pieces to the new environment. That isn&amp;rsquo;t going to stop me from learning about the other steps, though. I&amp;rsquo;ll update as I find new things.
&lt;/p&gt;
&lt;p&gt;
Here&amp;rsquo;s the links.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;General&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc303420.aspx"&gt;Upgrading to SharePoint Server 2010&lt;/a&gt; (TechNet) &lt;/li&gt;    
	&lt;li&gt;&lt;a href="http://www.microsoft.com/download/en/details.aspx?id=3837"&gt;Upgrading to Microsoft SharePoint Server 2010&lt;/a&gt; (DOC, PDF, EPUB, MOBI) &lt;/li&gt;    
	&lt;li&gt;&lt;a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=6260"&gt;Microsoft SharePoint 2010 Products Upgrade Approaches&lt;/a&gt; (PDF) &lt;/li&gt;    
	&lt;li&gt;&lt;a href="http://www.andrewconnell.com/blog/articles/upgrading-a-site-collection-from-sharepoint-server-2007-wcm-to.aspx"&gt;Upgrading a Site Collection from SharePoint Server 2007 WCM to SharePoint Server 2010 WCM&lt;/a&gt;&lt;/li&gt;    
	&lt;li&gt;&lt;a href="http://www.khamis.net/blog/Lists/Posts/Post.aspx?ID=4"&gt;SharePoint Server 2007 vs. 2010 Feature Comparison Matrix&lt;/a&gt;&lt;/li&gt;    
	&lt;li&gt;&lt;a href="http://sharepoint.microsoft.com/en-us/product/Pages/default.aspx"&gt;Product Information Feature Gallery&lt;/a&gt;&lt;/li&gt;    
	&lt;li&gt;&lt;a href="http://blogs.technet.com/b/vedant/archive/2010/06/14/sharepoint-2010-resource-guide.aspx"&gt;&lt;font style="font-weight: normal"&gt;SharePoint 2010 Resource Guide&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Visual Upgrade&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/ff607998.aspx"&gt;Manage visual upgrade&lt;/a&gt; (TechNet) &lt;/li&gt;    
	&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/gg454789.aspx"&gt;Understanding Visual Upgrade in SharePoint 2010&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;&lt;a href="http://www.sharepointpromag.com/article/sharepoint/migrating-users-to-sharepoint-2010-using-visual-upgrade"&gt;Migrating Users to SharePoint 2010 Using Visual Upgrade&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;&lt;a href="http://blogs.technet.com/b/chad/archive/2010/08/26/tip-38-sharepoint-2010-enable-visual-upgrade-on-sites-with-powershell.aspx"&gt;Enable Visual Upgrade on Sites with PowerShell&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/ff191199.aspx"&gt;Plan visual upgrade (SharePoint Server 2010)&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;&lt;a href="http://vasya10.wordpress.com/2011/03/26/upgrading-to-sharepoint-2010-look-and-feel/"&gt;Upgrading to SharePoint 2010 look and feel (via PowerShell)&lt;/a&gt; &lt;/li&gt; 
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Master Pages&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://sharepoint.microsoft.com/Blogs/GetThePoint/Lists/Posts/Post.aspx?ID=386"&gt;Working with SharePoint 2010 Master Pages&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;&lt;a href="http://sharepoint.ulitzer.com/node/1166942"&gt;Quick Overview of Master Pages in SharePoint 2010&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;&lt;a href="http://sharepointchick.com/archive/2010/03/26/deploying-a-custom-master-page-in-sharepoint-2010.aspx"&gt;Deploying a custom master page in SharePoint 2010&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee539981(office.14).aspx"&gt;Upgrading an Existing Master Page to the SharePoint Foundation Master Page&lt;/a&gt; &lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.michaelbowersox.com/2010/05/16/deploying-a-sharepoint-master-page-in-a-feature/"&gt;Deploying a SharePoint Master Page as a Feature&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Themes&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;     
	&lt;p&gt;
	&lt;a href="http://blogs.msdn.com/b/sharepointdev/archive/2011/02/03/working-with-sharepoint-2010-themes.aspx"&gt;Working with SharePoint 2010 Themes&lt;/a&gt;
	&lt;/p&gt;
	&lt;/li&gt; 
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;CSS&lt;/strong&gt;&amp;nbsp;
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&amp;nbsp;&lt;a href="http://erikswenson.blogspot.com/2010/01/sharepoint-2010-base-css-classes.html"&gt;SharePoint 2010 Base CSS Classes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Browser Compatibility&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
(Believe it or not, but DOCTYPE/IE8 compatibility comes into play b/c the client has a HUGE installed base of IE6 that is just now being upgraded to IE8 (no, not 9). Compatibility with IE8 is one of the requirements of the project.)
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/ie/archive/2008/01/21/compatibility-and-ie8.aspx"&gt;Compatibility and IE8&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;&lt;a href="http://www.alistapart.com/articles/beyonddoctype/"&gt;Beyond DOCTYPE: Web Standards, Forward Compatibility, and IE8&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc288325(v=VS.85).aspx"&gt;Defining Document Compatibility&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;&lt;a href="http://hsivonen.iki.fi/doctype/"&gt;Activating Browser Modes with Doctype&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/gg699338(v=VS.85).aspx"&gt;How to Enable Standards Support&lt;/a&gt; &lt;/li&gt;    
	&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms535242(v=VS.85).aspx"&gt;!DOCTYPE&lt;/a&gt; (reference) &lt;/li&gt; 
&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=Ndx9h3cGLg4:RxRBnmBfYxU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=Ndx9h3cGLg4:RxRBnmBfYxU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=Ndx9h3cGLg4:RxRBnmBfYxU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=Ndx9h3cGLg4:RxRBnmBfYxU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=Ndx9h3cGLg4:RxRBnmBfYxU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=Ndx9h3cGLg4:RxRBnmBfYxU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=Ndx9h3cGLg4:RxRBnmBfYxU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=Ndx9h3cGLg4:RxRBnmBfYxU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=Ndx9h3cGLg4:RxRBnmBfYxU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=Ndx9h3cGLg4:RxRBnmBfYxU:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsCodingTime/~4/Ndx9h3cGLg4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ItsCodingTime/~3/Ndx9h3cGLg4/post.aspx</link>
      <author>scott.nospam@nospam.itscodingtime.com (scottmarlowe)</author>
      <comments>http://www.itscodingtime.com/itscodingtime/post/SharePoint-2007-to-SharePoint-2010-Upgrade-Resources.aspx#comment</comments>
      <guid isPermaLink="false">http://www.itscodingtime.com/itscodingtime/post.aspx?id=10a33a20-bb4e-41e4-9acd-0098cfc3fdf5</guid>
      <pubDate>Wed, 14 Dec 2011 13:51:00 -0500</pubDate>
      <category>SharePoint2010</category>
      <dc:publisher>scottmarlowe</dc:publisher>
      <pingback:server>http://www.itscodingtime.com/itscodingtime/pingback.axd</pingback:server>
      <pingback:target>http://www.itscodingtime.com/itscodingtime/post.aspx?id=10a33a20-bb4e-41e4-9acd-0098cfc3fdf5</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.itscodingtime.com/itscodingtime/trackback.axd?id=10a33a20-bb4e-41e4-9acd-0098cfc3fdf5</trackback:ping>
      <wfw:comment>http://www.itscodingtime.com/itscodingtime/post/SharePoint-2007-to-SharePoint-2010-Upgrade-Resources.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.itscodingtime.com/itscodingtime/syndication.axd?post=10a33a20-bb4e-41e4-9acd-0098cfc3fdf5</wfw:commentRss>
    <feedburner:origLink>http://www.itscodingtime.com/itscodingtime/post.aspx?id=10a33a20-bb4e-41e4-9acd-0098cfc3fdf5</feedburner:origLink></item>
    <item>
      <title>Silverlight class library not included in .XAP</title>
      <description>&lt;p&gt;This is something I'm sure I ran into before, but it still bit me the other day. Hopefully by writing this down here it won't get me again.&lt;/p&gt;  &lt;p&gt;The problem is this: A Silverlight class library whose name ends with &amp;quot;.Resources&amp;quot; is &lt;a href="http://forums.silverlight.net/forums/p/101639/484181.aspx"&gt;not included in the Silverlight .XAP file&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;quot;.Resources&amp;quot; is a reserved naming convention (I guess) that shouldn't be used. The solution to including such DLL's in the .XAP file is to rename it so it ends with something like &amp;quot;.SharedResources.dll&amp;quot;.&lt;/p&gt;  &lt;p&gt;Short post. Odd problem. Easy solution.&lt;/p&gt;  &lt;p&gt;[ &lt;a href="http://www.twitter.com/scottmarlowe"&gt;&lt;font color="#0080ff"&gt;Follow me on Twitter&lt;/font&gt;&lt;/a&gt; ]&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=gl_gg_40s2k:9VQGpX-pLDE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=gl_gg_40s2k:9VQGpX-pLDE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=gl_gg_40s2k:9VQGpX-pLDE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=gl_gg_40s2k:9VQGpX-pLDE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=gl_gg_40s2k:9VQGpX-pLDE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=gl_gg_40s2k:9VQGpX-pLDE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=gl_gg_40s2k:9VQGpX-pLDE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=gl_gg_40s2k:9VQGpX-pLDE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=gl_gg_40s2k:9VQGpX-pLDE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=gl_gg_40s2k:9VQGpX-pLDE:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsCodingTime/~4/gl_gg_40s2k" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ItsCodingTime/~3/gl_gg_40s2k/post.aspx</link>
      <author>scott.nospam@nospam.itscodingtime.com (scottmarlowe)</author>
      <comments>http://www.itscodingtime.com/itscodingtime/post/Silverlight-class-library-not-included-in-XAP.aspx#comment</comments>
      <guid isPermaLink="false">http://www.itscodingtime.com/itscodingtime/post.aspx?id=4a51d80b-0681-4a39-bfe4-e91c496be510</guid>
      <pubDate>Sun, 10 Jul 2011 15:51:37 -0500</pubDate>
      <category>Silverlight</category>
      <dc:publisher>scottmarlowe</dc:publisher>
      <pingback:server>http://www.itscodingtime.com/itscodingtime/pingback.axd</pingback:server>
      <pingback:target>http://www.itscodingtime.com/itscodingtime/post.aspx?id=4a51d80b-0681-4a39-bfe4-e91c496be510</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.itscodingtime.com/itscodingtime/trackback.axd?id=4a51d80b-0681-4a39-bfe4-e91c496be510</trackback:ping>
      <wfw:comment>http://www.itscodingtime.com/itscodingtime/post/Silverlight-class-library-not-included-in-XAP.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.itscodingtime.com/itscodingtime/syndication.axd?post=4a51d80b-0681-4a39-bfe4-e91c496be510</wfw:commentRss>
    <feedburner:origLink>http://www.itscodingtime.com/itscodingtime/post.aspx?id=4a51d80b-0681-4a39-bfe4-e91c496be510</feedburner:origLink></item>
    <item>
      <title>A basic Silverlight project using the MVVM design pattern</title>
      <description>&lt;p&gt;I've been immersing myself in the &lt;a href="http://en.wikipedia.org/wiki/Model_view_viewmodel"&gt;Model-View-ViewModel&lt;/a&gt; (MVVM) design pattern of late. The pattern derives from &lt;a href="http://en.wikipedia.org/wiki/Model_View_Presenter"&gt;Model-View-Presenter&lt;/a&gt; (MVP), which in turn has its roots in the &lt;a href="http://en.wikipedia.org/wiki/Model-view-controller"&gt;Model-View-Controller&lt;/a&gt; (MVC) pattern. MVVM takes MVP one step further by gearing itself specifically towards WPF/Silverlight style development. While both WPF and Silverlight have built-in support for implementing MVVM (commanding, bindings, behaviors via the Expression Blend SDK), they do so with varying depth, and, even still, both fall short in terms of providing comprehensive support. Fortunately, a &lt;a href="http://www.japf.fr/2009/10/a-quick-tour-of-existing-mvvm-frameworks/"&gt;wide array&lt;/a&gt; of MVVM frameworks have cropped up to fill in these holes.&lt;/p&gt;  &lt;p&gt;In this post I wanted to go through the motions of setting up a skeleton Silverlight project that utilizes MVVM. The application doesn't do much (it displays a random number in response to user input), but it does demonstrate some of the basic facilities we can use to implement the MVVM pattern, namely commanding and binding. One of the primary goals of MVVM is to remove the (often tight) coupling between the presentation layer (XAML) and the business logic (code-behind). Some argue that &lt;a href="http://davybrion.com/blog/2010/07/the-mvvm-pattern-is-highly-overrated/"&gt;the pattern is overrated&lt;/a&gt;; we're simply removing logic from the code-behind and putting it into the ViewModel. This is true to some extent. But if you create a true separation between your UI and logic, and you take full advantage of the platform's support for MVVM, ultimately you'll find yourself writing less code. That's a good thing.&lt;/p&gt;  &lt;p&gt;Much of what I show below is encapsulated in the various MVVM frameworks. I'm ignoring those for now because I want to establish a deeper understanding of the implementation mechanics. Moving forward, I will most certainly be adopting one of the frameworks.&lt;/p&gt;  &lt;p&gt;Now, on to the code…&lt;/p&gt;  &lt;h4&gt;The Silverlight MVVM Project&lt;/h4&gt;  &lt;p&gt;&lt;strong&gt;1. Create a new Silverlight project&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Standard stuff. Create a new Silverlight project, giving it a host web site. I called mine &amp;quot;MVVMBase&amp;quot;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2. Add three new folders to the Silverlight project&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.itscodingtime.com/blogpostimages/MVVM-Basics_9CBE/image.png" width="180" height="165" /&gt;The three folders are:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;MVVMFramework &lt;/li&gt;    &lt;li&gt;ViewModels &lt;/li&gt;    &lt;li&gt;Views &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;3. In the MVVMFramework folder, add support classes&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;These are the classes that any of the MVVM frameworks will supply for you. Even if you choose to not use one of the frameworks and roll your own, you'll likely want to place these objects in their own reusable class library since any MVVM project will make use of them. As noted above, I'm rolling my own here simply as a learning exercise.&lt;/p&gt;  &lt;p&gt;Here are the classes. There are three of them.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;a. Observable&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;When we define our own ViewModel classes, it is necessary that those objects derive from INotifyPropertyChanged because we'll be using the class in binding operations. Normally, you might create a ViewModelBase class, derive it from INotifyPropertyChanged, and you're done.&amp;#160; It's been suggested by some, however, to separate out INotifyPropertyChanged functionality from the base ViewModel class since there are instances other than when defining a ViewModel where you might want to derive from INotifyPropertyChanged. That's what I've done here. Observable is defined as:&lt;/p&gt;  &lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;   &lt;div id="codeSnippet" class="csharpcode"&gt;     &lt;pre class="alt"&gt;&lt;span id="lnum1" class="lnum"&gt;   1:&lt;/span&gt; &lt;span class="kwrd"&gt;namespace&lt;/span&gt; MVVMBase.MVVMFramework&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum2" class="lnum"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum3" class="lnum"&gt;   3:&lt;/span&gt;     &lt;span class="kwrd"&gt;using&lt;/span&gt; System.ComponentModel;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum4" class="lnum"&gt;   4:&lt;/span&gt;     &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum5" class="lnum"&gt;   5:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum6" class="lnum"&gt;   6:&lt;/span&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Observable : INotifyPropertyChanged&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum7" class="lnum"&gt;   7:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum8" class="lnum"&gt;   8:&lt;/span&gt;         &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; PropertyChangedEventHandler PropertyChanged;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum9" class="lnum"&gt;   9:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum10" class="lnum"&gt;  10:&lt;/span&gt;         &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; NotifyPropertyChanged (&lt;span class="kwrd"&gt;string&lt;/span&gt; propertyName)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum11" class="lnum"&gt;  11:&lt;/span&gt;         {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum12" class="lnum"&gt;  12:&lt;/span&gt;             &lt;span class="kwrd"&gt;if&lt;/span&gt; (PropertyChanged != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum13" class="lnum"&gt;  13:&lt;/span&gt;             {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum14" class="lnum"&gt;  14:&lt;/span&gt;                 PropertyChanged (&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; PropertyChangedEventArgs (propertyName));&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum15" class="lnum"&gt;  15:&lt;/span&gt;             }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum16" class="lnum"&gt;  16:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum17" class="lnum"&gt;  17:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum18" class="lnum"&gt;  18:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div class="CopyToClipboard" style=""&gt;&lt;div&gt;&lt;a href="javascript:void(0);" onclick="CopyToClipboard_ViewPlain(copyToClipboardd453781270054455834961ad2412971d_4057);"&gt;View Plain&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
				&lt;div id="CopyToClipboard_Hidden" style="display:none;"&gt;&lt;/div&gt;
				&lt;div id="CopyToClipboard_FlashContainer"&gt;&lt;/div&gt;
                &lt;script type="text/javascript"&gt;

					function CopyToClipboard_Strip( text ){
						text = text.replace( /&amp;nbsp;/g, ' ' );
						text = text.replace( /&amp;quot;/g, '"' );
						text = text.replace( /&amp;#39;/g, '"' );
						text = text.replace( /&amp;amp;/g, '&amp;' );
						text = text.replace( /&amp;lt;/g, String.fromCharCode(60) );
						text = text.replace( /&amp;gt;/g, String.fromCharCode(62) );
						return text;
					}

					function CopyToClipboard_Copy(text)
					{
						if (window.clipboardData)
						{
							window.clipboardData.setData('text',text);
						}
						else
						{
							var clipboarddiv=document.getElementById('divclipboardswf');
							if(clipboarddiv==null)
							{
								clipboarddiv=document.createElement('div');
								clipboarddiv.setAttribute("name", "divclipboardswf");
								clipboarddiv.setAttribute("id", "divclipboardswf");
								document.body.appendChild(clipboarddiv);
							}

							clipboarddiv.innerHTML='&lt;embed src="http://www.itscodingtime.com/_clipboard.swf" FlashVars="clipboard='+
								encodeURIComponent(text)+'" width="0" height="0" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;';
						}

						return false;
					}
                    
					//function CopyToClipboard_Copy( text ){

						//### get reference to utility div
					//	var ele = document.getElementById('CopyToClipboard_Hidden');

						//### the following taken from: http://webchicanery.com/2006/11/14/clipboard-copy-javascript/
					//	if (false &amp;&amp; window.clipboardData) {
					//		window.clipboardData.setData( "Text", text );
					//	} else {
					//		document.getElementById('CopyToClipboard_FlashContainer').innerHTML = '';
					//		var divinfo = '&lt;embed id="CopyToClipboard_FlashFile" src="/itscodingtime/_clipboard.swf" FlashVars="clipboard=' + encodeURIComponent(text) + '" width="0" height="0" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;';
					//		document.getElementById('CopyToClipboard_FlashContainer').innerHTML = divinfo;
					//	}
                    //}

					function CopyToClipboard_ViewPlain( text ){
						var win = window.open( '', 'CopyToClipboard_Window', 'width=480, height=480, toolbar=no, menubar=no, scrollbars=auto, resizable=yes, location=no, directories=no, status=no' );
						win.document.write( '&lt;html&gt;&lt;head&gt;&lt;title&gt;Code&lt;/title&gt;&lt;body style="margin:0;padding:0;"&gt;&lt;textarea style="width:100%;height:100%;border:0;"&gt;' + text + '&lt;/textarea&gt;&lt;/body&gt;&lt;/html&gt;' );
					}

                &lt;/script&gt;
            
					&lt;script type="text/javascript"&gt;
						var copyToClipboardd453781270054455834961ad2412971d_4057 = CopyToClipboard_Strip('namespace MVVMBase.MVVMFramework\r\n{\r\n    using System.ComponentModel;\r\n    using System.Windows;\r\n\r\n    public class Observable : INotifyPropertyChanged\r\n    {\r\n        public event PropertyChangedEventHandler PropertyChanged;\r\n\r\n        protected void NotifyPropertyChanged (string propertyName)\r\n        {\r\n            if (PropertyChanged != null)\r\n            {\r\n                PropertyChanged (this, new PropertyChangedEventArgs (propertyName));\r\n            }\r\n        }\r\n    }\r\n}');
					&lt;/script&gt;

&lt;p&gt;&lt;strong&gt;b. ViewModelBase&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's convenient to have a ViewModel base class from which your own ViewModel classes can derive. For purposes of this post, mine doesn't do much except derive from Observable:&lt;/p&gt;

&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
  &lt;div id="codeSnippet" class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span id="lnum1" class="lnum"&gt;   1:&lt;/span&gt; &lt;span class="kwrd"&gt;namespace&lt;/span&gt; MVVMBase.MVVMFramework&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum2" class="lnum"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum3" class="lnum"&gt;   3:&lt;/span&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ViewModelBase : Observable&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum4" class="lnum"&gt;   4:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum5" class="lnum"&gt;   5:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum6" class="lnum"&gt;   6:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div class="CopyToClipboard" style=""&gt;&lt;div&gt;&lt;a href="javascript:void(0);" onclick="CopyToClipboard_ViewPlain(copyToClipboardd453781270054455834961ad2412971d_10346);"&gt;View Plain&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
					&lt;script type="text/javascript"&gt;
						var copyToClipboardd453781270054455834961ad2412971d_10346 = CopyToClipboard_Strip('namespace MVVMBase.MVVMFramework\r\n{\r\n    public class ViewModelBase : Observable\r\n    {\r\n    }\r\n}');
					&lt;/script&gt;

&lt;p&gt;&lt;strong&gt;c. RelayCommand&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;WPF introduced something called &lt;a href="http://msdn.microsoft.com/en-us/library/ms752308.aspx"&gt;Commanding&lt;/a&gt;, which allows you to bind a user event (like a button click) to execution logic where the binding is done in XAML. User-defined commands are derived from &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.input.icommand.aspx"&gt;ICommand&lt;/a&gt;; you need to have one defined per command event. Of course, if you define a new ICommand for each and every command, you'll quickly have a lot of repetitive code. Fortunately, there's a better way.&lt;/p&gt;

&lt;p&gt;RelayCommand (alternatively named DelegateCommand or ViewModelCommand by others) is a generic class that derives from ICommand. It takes as parameters an &lt;a href="http://msdn.microsoft.com/en-us/library/018hxwa8(v=VS.100).aspx"&gt;Action&lt;/a&gt; and a &lt;a href="http://msdn.microsoft.com/en-us/library/bfcke1bz(v=VS.100).aspx"&gt;Predicate&lt;/a&gt;, which define ICommand's &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.input.icommand.execute.aspx"&gt;Execute&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.input.icommand.canexecute.aspx"&gt;CanExecute&lt;/a&gt; methods which RelayCommand must implement.&lt;/p&gt;

&lt;p&gt;Here's the code:&lt;/p&gt;

&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
  &lt;div id="codeSnippet" class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span id="lnum1" class="lnum"&gt;   1:&lt;/span&gt; &lt;span class="kwrd"&gt;namespace&lt;/span&gt; MVVMBase.MVVMFramework&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum2" class="lnum"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum3" class="lnum"&gt;   3:&lt;/span&gt;     &lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum4" class="lnum"&gt;   4:&lt;/span&gt;     &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows.Input;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum5" class="lnum"&gt;   5:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum6" class="lnum"&gt;   6:&lt;/span&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; RelayCommand : ICommand&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum7" class="lnum"&gt;   7:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum8" class="lnum"&gt;   8:&lt;/span&gt;         &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; Action&amp;lt;&lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt; _executeAction;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum9" class="lnum"&gt;   9:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum10" class="lnum"&gt;  10:&lt;/span&gt;         &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; Predicate&amp;lt;&lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt; _canExecute;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum11" class="lnum"&gt;  11:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum12" class="lnum"&gt;  12:&lt;/span&gt;         &lt;span class="kwrd"&gt;public&lt;/span&gt; RelayCommand (Action&amp;lt;&lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt; executeAction, Predicate&amp;lt;&lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt; canExecute)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum13" class="lnum"&gt;  13:&lt;/span&gt;         {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum14" class="lnum"&gt;  14:&lt;/span&gt;             &lt;span class="kwrd"&gt;if&lt;/span&gt; (executeAction == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum15" class="lnum"&gt;  15:&lt;/span&gt;             {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum16" class="lnum"&gt;  16:&lt;/span&gt;                 &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentNullException (&lt;span class="str"&gt;&amp;quot;executeAction&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum17" class="lnum"&gt;  17:&lt;/span&gt;             }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum18" class="lnum"&gt;  18:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum19" class="lnum"&gt;  19:&lt;/span&gt;             _executeAction = executeAction;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum20" class="lnum"&gt;  20:&lt;/span&gt;             _canExecute = canExecute;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum21" class="lnum"&gt;  21:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum22" class="lnum"&gt;  22:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum23" class="lnum"&gt;  23:&lt;/span&gt;         &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; EventHandler CanExecuteChanged;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum24" class="lnum"&gt;  24:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum25" class="lnum"&gt;  25:&lt;/span&gt;         &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnCanExecuteChanged ()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum26" class="lnum"&gt;  26:&lt;/span&gt;         {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum27" class="lnum"&gt;  27:&lt;/span&gt;             &lt;span class="kwrd"&gt;if&lt;/span&gt; (CanExecuteChanged != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum28" class="lnum"&gt;  28:&lt;/span&gt;             {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum29" class="lnum"&gt;  29:&lt;/span&gt;                 CanExecuteChanged (&lt;span class="kwrd"&gt;this&lt;/span&gt;, EventArgs.Empty);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum30" class="lnum"&gt;  30:&lt;/span&gt;             }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum31" class="lnum"&gt;  31:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum32" class="lnum"&gt;  32:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum33" class="lnum"&gt;  33:&lt;/span&gt;         &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum34" class="lnum"&gt;  34:&lt;/span&gt;         &lt;span class="rem"&gt;/// Defines the method that determines whether the command can execute in its current state.&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum35" class="lnum"&gt;  35:&lt;/span&gt;         &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum36" class="lnum"&gt;  36:&lt;/span&gt;         &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;True if this command can be executed; otherwise, false.&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum37" class="lnum"&gt;  37:&lt;/span&gt;         &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;parameter&amp;quot;&amp;gt;Data used by the command. If the command does not require data to be passed, this object can be set to null.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum38" class="lnum"&gt;  38:&lt;/span&gt;         &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; CanExecute (&lt;span class="kwrd"&gt;object&lt;/span&gt; parameter)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum39" class="lnum"&gt;  39:&lt;/span&gt;         {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum40" class="lnum"&gt;  40:&lt;/span&gt;             &lt;span class="kwrd"&gt;return&lt;/span&gt; _canExecute == &lt;span class="kwrd"&gt;null&lt;/span&gt; || _canExecute (parameter);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum41" class="lnum"&gt;  41:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum42" class="lnum"&gt;  42:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum43" class="lnum"&gt;  43:&lt;/span&gt;         &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum44" class="lnum"&gt;  44:&lt;/span&gt;         &lt;span class="rem"&gt;/// Defines the method to be called when the command is invoked.&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum45" class="lnum"&gt;  45:&lt;/span&gt;         &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum46" class="lnum"&gt;  46:&lt;/span&gt;         &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;parameter&amp;quot;&amp;gt;Data used by the command. If the command does not require data to be passed, this object can be set to null.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum47" class="lnum"&gt;  47:&lt;/span&gt;         &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Execute (&lt;span class="kwrd"&gt;object&lt;/span&gt; parameter)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum48" class="lnum"&gt;  48:&lt;/span&gt;         {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum49" class="lnum"&gt;  49:&lt;/span&gt;             _executeAction (parameter);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum50" class="lnum"&gt;  50:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum51" class="lnum"&gt;  51:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum52" class="lnum"&gt;  52:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div class="CopyToClipboard" style=""&gt;&lt;div&gt;&lt;a href="javascript:void(0);" onclick="CopyToClipboard_ViewPlain(copyToClipboardd453781270054455834961ad2412971d_12880);"&gt;View Plain&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
					&lt;script type="text/javascript"&gt;
						var copyToClipboardd453781270054455834961ad2412971d_12880 = CopyToClipboard_Strip('namespace MVVMBase.MVVMFramework\r\n{\r\n    using System;\r\n    using System.Windows.Input;\r\n\r\n    public class RelayCommand : ICommand\r\n    {\r\n        private readonly Action&amp;lt;object&amp;gt; _executeAction;\r\n\r\n        private readonly Predicate&amp;lt;object&amp;gt; _canExecute;\r\n\r\n        public RelayCommand (Action&amp;lt;object&amp;gt; executeAction, Predicate&amp;lt;object&amp;gt; canExecute)\r\n        {\r\n            if (executeAction == null)\r\n            {\r\n                throw new ArgumentNullException (&amp;quot;executeAction&amp;quot;);\r\n            }\r\n\r\n            _executeAction = executeAction;\r\n            _canExecute = canExecute;\r\n        }\r\n\r\n        public event EventHandler CanExecuteChanged;\r\n\r\n        public void OnCanExecuteChanged ()\r\n        {\r\n            if (CanExecuteChanged != null)\r\n            {\r\n                CanExecuteChanged (this, EventArgs.Empty);\r\n            }\r\n        }\r\n\r\n        /// &amp;lt;summary&amp;gt;\r\n        /// Defines the method that determines whether the command can execute in its current state.\r\n        /// &amp;lt;/summary&amp;gt;\r\n        /// &amp;lt;returns&amp;gt;True if this command can be executed; otherwise, false.&amp;lt;/returns&amp;gt;\r\n        /// &amp;lt;param name=&amp;quot;parameter&amp;quot;&amp;gt;Data used by the command. If the command does not require data to be passed, this object can be set to null.&amp;lt;/param&amp;gt;\r\n        public bool CanExecute (object parameter)\r\n        {\r\n            return _canExecute == null || _canExecute (parameter);\r\n        }\r\n\r\n        /// &amp;lt;summary&amp;gt;\r\n        /// Defines the method to be called when the command is invoked.\r\n        /// &amp;lt;/summary&amp;gt;\r\n        /// &amp;lt;param name=&amp;quot;parameter&amp;quot;&amp;gt;Data used by the command. If the command does not require data to be passed, this object can be set to null.&amp;lt;/param&amp;gt;\r\n        public void Execute (object parameter)\r\n        {\r\n            _executeAction (parameter);\r\n        }\r\n    }\r\n}');
					&lt;/script&gt;

&lt;p&gt;&lt;strong&gt;4. In the ViewModels folder, add a new class called &amp;quot;MainPageViewModel&amp;quot;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is our ViewModel, derived from ViewModelBase, which contains the business logic for updating our View. Note that the ViewModel doesn't update the View directly. Instead, it updates properties that have been bound to the View in the View's XAML.&lt;/p&gt;

&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
  &lt;div id="codeSnippet" class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span id="lnum1" class="lnum"&gt;   1:&lt;/span&gt; &lt;span class="kwrd"&gt;namespace&lt;/span&gt; MVVMBase.ViewModels&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum2" class="lnum"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum3" class="lnum"&gt;   3:&lt;/span&gt;     &lt;span class="kwrd"&gt;using&lt;/span&gt; MVVMBase.MVVMFramework;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum4" class="lnum"&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum5" class="lnum"&gt;   5:&lt;/span&gt;     &lt;span class="kwrd"&gt;using&lt;/span&gt; RandomNumber;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum6" class="lnum"&gt;   6:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum7" class="lnum"&gt;   7:&lt;/span&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MainPageViewModel : ViewModelBase&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum8" class="lnum"&gt;   8:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum9" class="lnum"&gt;   9:&lt;/span&gt;         &lt;span class="kwrd"&gt;private&lt;/span&gt; IGenerateNumber _generateNumber;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum10" class="lnum"&gt;  10:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum11" class="lnum"&gt;  11:&lt;/span&gt;         &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; _number;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum12" class="lnum"&gt;  12:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum13" class="lnum"&gt;  13:&lt;/span&gt;         &lt;span class="kwrd"&gt;public&lt;/span&gt; MainPageViewModel (IGenerateNumber generateNumber)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum14" class="lnum"&gt;  14:&lt;/span&gt;         {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum15" class="lnum"&gt;  15:&lt;/span&gt;             _generateNumber = generateNumber;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum16" class="lnum"&gt;  16:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum17" class="lnum"&gt;  17:&lt;/span&gt;             GetNumberCommand = &lt;span class="kwrd"&gt;new&lt;/span&gt; RelayCommand (GetNumber, CanGetNumber);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum18" class="lnum"&gt;  18:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum19" class="lnum"&gt;  19:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum20" class="lnum"&gt;  20:&lt;/span&gt;         &lt;span class="kwrd"&gt;public&lt;/span&gt; RelayCommand GetNumberCommand { get; &lt;span class="kwrd"&gt;private&lt;/span&gt; set; }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum21" class="lnum"&gt;  21:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum22" class="lnum"&gt;  22:&lt;/span&gt;         &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Number&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum23" class="lnum"&gt;  23:&lt;/span&gt;         {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum24" class="lnum"&gt;  24:&lt;/span&gt;             get&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum25" class="lnum"&gt;  25:&lt;/span&gt;             {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum26" class="lnum"&gt;  26:&lt;/span&gt;                 &lt;span class="kwrd"&gt;return&lt;/span&gt; _number;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum27" class="lnum"&gt;  27:&lt;/span&gt;             }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum28" class="lnum"&gt;  28:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum29" class="lnum"&gt;  29:&lt;/span&gt;             &lt;span class="kwrd"&gt;private&lt;/span&gt; set&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum30" class="lnum"&gt;  30:&lt;/span&gt;             {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum31" class="lnum"&gt;  31:&lt;/span&gt;                 &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == _number)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum32" class="lnum"&gt;  32:&lt;/span&gt;                     &lt;span class="kwrd"&gt;return&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum33" class="lnum"&gt;  33:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum34" class="lnum"&gt;  34:&lt;/span&gt;                 _number = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum35" class="lnum"&gt;  35:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum36" class="lnum"&gt;  36:&lt;/span&gt;                 NotifyPropertyChanged (&lt;span class="str"&gt;&amp;quot;Number&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum37" class="lnum"&gt;  37:&lt;/span&gt;             }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum38" class="lnum"&gt;  38:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum39" class="lnum"&gt;  39:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum40" class="lnum"&gt;  40:&lt;/span&gt;         &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; GetNumber (&lt;span class="kwrd"&gt;object&lt;/span&gt; parameter)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum41" class="lnum"&gt;  41:&lt;/span&gt;         {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum42" class="lnum"&gt;  42:&lt;/span&gt;             Number = _generateNumber.GetRandomNumber ().ToString ();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum43" class="lnum"&gt;  43:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum44" class="lnum"&gt;  44:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum45" class="lnum"&gt;  45:&lt;/span&gt;         &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; CanGetNumber (&lt;span class="kwrd"&gt;object&lt;/span&gt; parameter)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum46" class="lnum"&gt;  46:&lt;/span&gt;         {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum47" class="lnum"&gt;  47:&lt;/span&gt;             &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum48" class="lnum"&gt;  48:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum49" class="lnum"&gt;  49:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum50" class="lnum"&gt;  50:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div class="CopyToClipboard" style=""&gt;&lt;div&gt;&lt;a href="javascript:void(0);" onclick="CopyToClipboard_ViewPlain(copyToClipboardd453781270054455834961ad2412971d_23324);"&gt;View Plain&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
					&lt;script type="text/javascript"&gt;
						var copyToClipboardd453781270054455834961ad2412971d_23324 = CopyToClipboard_Strip('namespace MVVMBase.ViewModels\r\n{\r\n    using MVVMBase.MVVMFramework;\r\n\r\n    using RandomNumber;\r\n\r\n    public class MainPageViewModel : ViewModelBase\r\n    {\r\n        private IGenerateNumber _generateNumber;\r\n\r\n        private string _number;\r\n\r\n        public MainPageViewModel (IGenerateNumber generateNumber)\r\n        {\r\n            _generateNumber = generateNumber;\r\n\r\n            GetNumberCommand = new RelayCommand (GetNumber, CanGetNumber);\r\n        }\r\n\r\n        public RelayCommand GetNumberCommand { get; private set; }\r\n\r\n        public string Number\r\n        {\r\n            get\r\n            {\r\n                return _number;\r\n            }\r\n\r\n            private set\r\n            {\r\n                if (value == _number)\r\n                    return;\r\n\r\n                _number = value;\r\n\r\n                NotifyPropertyChanged (&amp;quot;Number&amp;quot;);\r\n            }\r\n        }\r\n\r\n        private void GetNumber (object parameter)\r\n        {\r\n            Number = _generateNumber.GetRandomNumber ().ToString ();\r\n        }\r\n\r\n        private bool CanGetNumber (object parameter)\r\n        {\r\n            return true;\r\n        }\r\n    }\r\n}');
					&lt;/script&gt;

&lt;p&gt;The constructor takes an interface to GenerateNumber, which is just a class library whose code is included in the download (see below). This service class generates a random number and returns it to the caller via the GetRandomNumber method.&lt;/p&gt;

&lt;p&gt;GetNumber and CanGetNumber correspond to the RelayCommand's Action and Predicate delegates. ICommand gives us the ability to turn off a feature via a CanExecute method and to execute some logic in response to a command via a Execute method. That's the role these two delegates play. In CanGetNumber I simply return 'true'; in a real application you might have logic here that actually checks conditions and then possibly returns false if you do not want the command to execute. GetNumber runs if and when CanExecute evaluates to 'true'. Here it initializes the &lt;a href="http://en.wikipedia.org/wiki/Plain_Old_CLR_Object"&gt;POCO&lt;/a&gt; property Number with a new random number. See the discussion beneath the View code for what's going on behind the scenes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. In the Views folder, copy over and rename MainPage.xaml/.cs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;MainPage.xaml/.cs was created when you created the Silverlight project. Rename it to MainPageView.xaml/.cs and copy it into the Views folder (you don't have to rename it, but I do just for naming consistency; remember to rename the class, too).&lt;/p&gt;

&lt;p&gt;First, let's look at the codebehind:&lt;/p&gt;

&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
  &lt;div id="codeSnippet" class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span id="lnum1" class="lnum"&gt;   1:&lt;/span&gt; &lt;span class="kwrd"&gt;namespace&lt;/span&gt; MVVMBase.Views&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum2" class="lnum"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum3" class="lnum"&gt;   3:&lt;/span&gt;     &lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows.Controls;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum4" class="lnum"&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum5" class="lnum"&gt;   5:&lt;/span&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MainPageView : UserControl&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum6" class="lnum"&gt;   6:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum7" class="lnum"&gt;   7:&lt;/span&gt;         &lt;span class="kwrd"&gt;public&lt;/span&gt; MainPageView ()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum8" class="lnum"&gt;   8:&lt;/span&gt;         {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum9" class="lnum"&gt;   9:&lt;/span&gt;             InitializeComponent ();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum10" class="lnum"&gt;  10:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum11" class="lnum"&gt;  11:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum12" class="lnum"&gt;  12:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div class="CopyToClipboard" style=""&gt;&lt;div&gt;&lt;a href="javascript:void(0);" onclick="CopyToClipboard_ViewPlain(copyToClipboardd453781270054455834961ad2412971d_32788);"&gt;View Plain&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
					&lt;script type="text/javascript"&gt;
						var copyToClipboardd453781270054455834961ad2412971d_32788 = CopyToClipboard_Strip('namespace MVVMBase.Views\r\n{\r\n    using System.Windows.Controls;\r\n\r\n    public partial class MainPageView : UserControl\r\n    {\r\n        public MainPageView ()\r\n        {\r\n            InitializeComponent ();\r\n        }\r\n    }\r\n}');
					&lt;/script&gt;

&lt;p&gt;As we intended, it pretty much contains nothing. This is as it should be when implementing the MVVM pattern, though note that achieving this ideal while easy in a small project like this one, can be very difficult and almost counter-productive in a real-world, complex application.&lt;/p&gt;

&lt;p&gt;Next, take a look at the MainPageView.xaml file:&lt;/p&gt;

&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
  &lt;div id="codeSnippet" class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span id="lnum1" class="lnum"&gt;   1:&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;UserControl&lt;/span&gt; &lt;span class="attr"&gt;xmlns:sdk&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;x:Class&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;MVVMBase.Views.MainPageView&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum2" class="lnum"&gt;   2:&lt;/span&gt;     &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum3" class="lnum"&gt;   3:&lt;/span&gt;     &lt;span class="attr"&gt;xmlns:x&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum4" class="lnum"&gt;   4:&lt;/span&gt;     &lt;span class="attr"&gt;xmlns:d&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://schemas.microsoft.com/expression/blend/2008&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum5" class="lnum"&gt;   5:&lt;/span&gt;     &lt;span class="attr"&gt;xmlns:mc&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://schemas.openxmlformats.org/markup-compatibility/2006&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum6" class="lnum"&gt;   6:&lt;/span&gt;     &lt;span class="attr"&gt;mc:Ignorable&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;d&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum7" class="lnum"&gt;   7:&lt;/span&gt;     &lt;span class="attr"&gt;d:DesignHeight&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;200&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;d:DesignWidth&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;150&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum8" class="lnum"&gt;   8:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum9" class="lnum"&gt;   9:&lt;/span&gt;     &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;LayoutRoot&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Orientation&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Vertical&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Background&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;White&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;VerticalAlignment&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Center&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum10" class="lnum"&gt;  10:&lt;/span&gt;         &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;sdk:Label&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding Number}&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;30&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;100&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Background&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;AliceBlue&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;10&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum11" class="lnum"&gt;  11:&lt;/span&gt;         &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Get Number&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;30&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;100&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;10&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Command&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding GetNumberCommand}&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum12" class="lnum"&gt;  12:&lt;/span&gt;     &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum13" class="lnum"&gt;  13:&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;UserControl&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div class="CopyToClipboard" style=""&gt;&lt;div&gt;&lt;a href="javascript:void(0);" onclick="CopyToClipboard_ViewPlain(copyToClipboardd453781270054455834961ad2412971d_35280);"&gt;View Plain&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
					&lt;script type="text/javascript"&gt;
						var copyToClipboardd453781270054455834961ad2412971d_35280 = CopyToClipboard_Strip('&amp;lt;UserControl xmlns:sdk=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk&amp;quot; x:Class=&amp;quot;MVVMBase.Views.MainPageView&amp;quot;\r\n    xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;\r\n    xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;\r\n    xmlns:d=&amp;quot;http://schemas.microsoft.com/expression/blend/2008&amp;quot;\r\n    xmlns:mc=&amp;quot;http://schemas.openxmlformats.org/markup-compatibility/2006&amp;quot;\r\n    mc:Ignorable=&amp;quot;d&amp;quot;\r\n    d:DesignHeight=&amp;quot;200&amp;quot; d:DesignWidth=&amp;quot;150&amp;quot;&amp;gt;\r\n\r\n    &amp;lt;StackPanel x:Name=&amp;quot;LayoutRoot&amp;quot; Orientation=&amp;quot;Vertical&amp;quot; Background=&amp;quot;White&amp;quot; VerticalAlignment=&amp;quot;Center&amp;quot;&amp;gt;\r\n        &amp;lt;sdk:Label Content=&amp;quot;{Binding Number}&amp;quot; Height=&amp;quot;30&amp;quot; Width=&amp;quot;100&amp;quot; Background=&amp;quot;AliceBlue&amp;quot; Margin=&amp;quot;10&amp;quot; /&amp;gt;\r\n        &amp;lt;Button Content=&amp;quot;Get Number&amp;quot; Height=&amp;quot;30&amp;quot; Width=&amp;quot;100&amp;quot; Margin=&amp;quot;10&amp;quot; Command=&amp;quot;{Binding GetNumberCommand}&amp;quot; /&amp;gt;\r\n    &amp;lt;/StackPanel&amp;gt;\r\n&amp;lt;/UserControl&amp;gt;');
					&lt;/script&gt;

&lt;p&gt;The important stuff is on lines 10-11.&lt;/p&gt;

&lt;p&gt;On Line 10, we define a Label whose Content is bound to a property called &amp;quot;Number&amp;quot;. If you go back and look at the ViewModel, you'll see I defined a POCO property there that corresponds to this binding. The magic is the call to NotifyPropertyChanged, which notifies the binding framework that this property's value has changed. This in turn triggers an update to our UI because of the Binding we set up.&lt;/p&gt;

&lt;p&gt;On Line 11, we declare a Button whose Command property is bound to something called &amp;quot;GetNumberCommand&amp;quot;. Again, looking back at MainPageViewModel, you'll see a RelayCommand that corresponds to this binding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Connect the View to the ViewModel&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At this point we have all the infrastructure in place for a basic Silverlight MVVM application. But we still need to connect the View to the ViewModel. There are several philosophies out there on how best to do this. The basic options are these (&lt;a href="https://twitter.com/#!/pete_brown"&gt;Pete Brown&lt;/a&gt; touches on these approaches in his book, &lt;a href="http://www.amazon.com/gp/product/1935182374/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=scottmarlowe-20&amp;amp;linkCode=as2&amp;amp;camp=217145&amp;amp;creative=399349&amp;amp;creativeASIN=1935182374"&gt;Silverlight 4 in Action&lt;/a&gt;&lt;img style="border-bottom-style: none !important; margin: 0px; border-left-style: none !important; border-top-style: none !important; border-right-style: none !important" border="0" alt="" src="http://www.assoc-amazon.com/e/ir?t=&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1935182374&amp;amp;camp=217145&amp;amp;creative=399349" width="1" height="1" /&gt;):&lt;/p&gt;

&lt;p&gt;&lt;em&gt;1.) The code owns the ViewModel&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this approach you instantiate the ViewModel in the View's code-behind and assign it to the View's DataContext. While straightforward, this is not a recommended approach mostly because you've created a situation where the View cannot be used without also pulling the ViewModel along with it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;2.) The markup owns the ViewModel&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is essentially the same thing as the previous approach except in this case you declare the ViewModel in the View's XAML. Again, while relatively straightforward, you're creating a tightly bound relationship between the View and the ViewModel. This isn't necessarily a bad thing; in MVVM, a View is going to have a ViewModel, right? The truth of the matter is that either this approach or the previous one works perfectly fine. But option #3 has the added benefit of additional flexibility.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;3.) The ViewModel is provided externally&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this approach the ViewModel is instantiated externally from the View and the two are bound together outside of either the View or the ViewModel. The benefit of this is a more loosely coupled arrangement, enhanced testability, and the ability to inject a different ViewModel for a given View rather than just the default. This is the approach I took.&lt;/p&gt;

&lt;p&gt;In App.xaml.cs, I added the following code to the Application_Startup event:&lt;/p&gt;

&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
  &lt;div id="codeSnippet" class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span id="lnum1" class="lnum"&gt;   1:&lt;/span&gt; var mainPageViewModel = &lt;span class="kwrd"&gt;new&lt;/span&gt; MainPageViewModel (&lt;span class="kwrd"&gt;new&lt;/span&gt; GenerateNumber ());&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum2" class="lnum"&gt;   2:&lt;/span&gt; RootVisual = &lt;span class="kwrd"&gt;new&lt;/span&gt; MainPageView { DataContext = mainPageViewModel };&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div class="CopyToClipboard" style=""&gt;&lt;div&gt;&lt;a href="javascript:void(0);" onclick="CopyToClipboard_ViewPlain(copyToClipboardd453781270054455834961ad2412971d_43843);"&gt;View Plain&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
					&lt;script type="text/javascript"&gt;
						var copyToClipboardd453781270054455834961ad2412971d_43843 = CopyToClipboard_Strip('var mainPageViewModel = new MainPageViewModel (new GenerateNumber ());\r\nRootVisual = new MainPageView { DataContext = mainPageViewModel };');
					&lt;/script&gt;

&lt;p align="left"&gt;First, instantiate the ViewModel, passing in a GenerateNumber object via &lt;a href="http://dotnetslackers.com/articles/designpatterns/DI-Patterns-Constructor-Injection.aspx"&gt;constructor injection&lt;/a&gt; (GenerateNumber is a service class that generates a random number; download the sample code to see it in all it's glory). Then, new up the View, setting it's DataContext to the ViewModel while also assigning the View itself to the application's RootVisual property. &lt;/p&gt;

&lt;p&gt;It's setting the View's DataContext to the ViewModel class which essentially &amp;quot;glues&amp;quot; the ViewModel to the View. Also, if we wanted to use a different ViewModel with this View (or have several Views of this type each with a different ViewModel type), it's as simple as assigning each ViewModel type to the View's DataContext. You'd have some difficulty doing that with either of the other ownership approaches above.&lt;/p&gt;

&lt;h4&gt;Conclusion&lt;/h4&gt;

&lt;p&gt;This is more or less the bare minimum you must implement in order to adhere to the tenets of the MVVM pattern. I know I left some things out—MVVM frameworks and &lt;a href="http://martinfowler.com/articles/injection.html"&gt;IoC Containers&lt;/a&gt;, for starters. These are platforms that make your life easier, but are not necessarily requirements of implementing the pattern. I know my next step, however, is to start evaluating the options available for each. Future posts should start to steer down those roads.&lt;/p&gt;

&lt;p&gt;For more information on the MVVM pattern, take a look at my &lt;a href="http://www.itscodingtime.com/itscodingtime/post/MVVM-Reference.aspx"&gt;MVVM Reference&lt;/a&gt; post.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Download:&lt;/strong&gt; &lt;a title="MVVMBase" href="http://www.itscodingtime.com/file.axd?file=code/MVVMBase.zip"&gt;MVVMBase.zip&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=kIeTjgdfMrc:gPxtV-UTTRg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=kIeTjgdfMrc:gPxtV-UTTRg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=kIeTjgdfMrc:gPxtV-UTTRg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=kIeTjgdfMrc:gPxtV-UTTRg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=kIeTjgdfMrc:gPxtV-UTTRg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=kIeTjgdfMrc:gPxtV-UTTRg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=kIeTjgdfMrc:gPxtV-UTTRg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=kIeTjgdfMrc:gPxtV-UTTRg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=kIeTjgdfMrc:gPxtV-UTTRg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=kIeTjgdfMrc:gPxtV-UTTRg:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsCodingTime/~4/kIeTjgdfMrc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ItsCodingTime/~3/kIeTjgdfMrc/post.aspx</link>
      <author>scott.nospam@nospam.itscodingtime.com (scottmarlowe)</author>
      <comments>http://www.itscodingtime.com/itscodingtime/post/A-basic-Silverlight-project-using-the-MVVM-design-pattern.aspx#comment</comments>
      <guid isPermaLink="false">http://www.itscodingtime.com/itscodingtime/post.aspx?id=75de8fd9-030c-4ead-a890-e79b6e5252cc</guid>
      <pubDate>Fri, 20 May 2011 08:07:00 -0500</pubDate>
      <category>Design Patterns</category>
      <category>Silverlight</category>
      <dc:publisher>scottmarlowe</dc:publisher>
      <pingback:server>http://www.itscodingtime.com/itscodingtime/pingback.axd</pingback:server>
      <pingback:target>http://www.itscodingtime.com/itscodingtime/post.aspx?id=75de8fd9-030c-4ead-a890-e79b6e5252cc</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.itscodingtime.com/itscodingtime/trackback.axd?id=75de8fd9-030c-4ead-a890-e79b6e5252cc</trackback:ping>
      <wfw:comment>http://www.itscodingtime.com/itscodingtime/post/A-basic-Silverlight-project-using-the-MVVM-design-pattern.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.itscodingtime.com/itscodingtime/syndication.axd?post=75de8fd9-030c-4ead-a890-e79b6e5252cc</wfw:commentRss>
    <feedburner:origLink>http://www.itscodingtime.com/itscodingtime/post.aspx?id=75de8fd9-030c-4ead-a890-e79b6e5252cc</feedburner:origLink></item>
    <item>
      <title>MVVM Reference</title>
      <description>&lt;p&gt;I&amp;#39;ve compiled a short list of articles and posts on MVVM that I&amp;#39;ve found especially useful. I&amp;#39;ll likely expand this as I continue to work through the pattern and explore some of the various MVVM frameworks. For now, here are the links. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The Pattern Explained&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;	   	&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/johngossman/archive/2005/10/08/478683.aspx" title="Introduction to Model-View-ViewModel pattern for building WPF apps - Tales from the Smart Client"&gt;Introduction to Model-View-ViewModel pattern for building WPF apps&lt;/a&gt;&lt;/li&gt;    	&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/dd419663.aspx"&gt;WPF Apps With The Model-View-ViewModel Design Pattern&lt;/a&gt;&lt;/li&gt;    	&lt;li&gt;&lt;a href="http://openlightgroup.net/Blog/tabid/58/EntryId/89/Silverlight-View-Model-Style-An-Overly-Simplified-Explanation.aspx"&gt;Silverlight View Model Style: An (Overly) Simplified Explanation&lt;/a&gt; &lt;/li&gt;    	&lt;li&gt;&lt;a href="http://waf.codeplex.com/wikipage?title=Model-View-ViewModel%20Pattern&amp;amp;referringTitle=Documentation" title="WPF Application Framework (WAF) - Model-View-ViewModel Pattern"&gt;WPF Application Framework (WAF) - Model-View-ViewModel Pattern&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;The Pattern Discussed&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;	   	&lt;li&gt;&lt;a href="http://devlicious.com/blogs/rob_eisenberg/archive/2009/07/07/mvvm-philosophy-and-case-studies-introduction.aspx"&gt;MVVM &amp;ndash; Philosophy and Case Studies - Introduction&lt;/a&gt; &lt;/li&gt;    	&lt;li&gt;&lt;a href="http://jesseliberty.com/2010/05/08/mvvm-its-not-kool-aid-3/"&gt;MVVM &amp;ndash; It&amp;rsquo;s Not Kool-Aid&lt;/a&gt; &lt;/li&gt;    	&lt;li&gt;&lt;a href="http://codebetter.com/wardbell/2010/03/19/mvvm-josh-smith-s-way/"&gt;MVVM, Josh Smith&amp;rsquo;s Way&lt;/a&gt; &lt;/li&gt;    	&lt;li&gt;&lt;a href="http://davybrion.com/blog/2010/07/the-mvvm-pattern-is-highly-overrated/" title="The MVVM Pattern Is Highly Overrated"&gt;The MVVM Pattern Is Highly Overrated&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Commanding&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;	   	&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc785480.aspx" title="Advanced WPF- Understanding Routed Events And Commands In WPF"&gt;Advanced WPF- Understanding Routed Events And Commands In WPF&lt;/a&gt; &lt;/li&gt;    	&lt;li&gt;&lt;a href="http://weblogs.asp.net/fredriknormen/archive/2009/11/30/silverlight-4-mvvm-with-commanding-and-wcf-ria-services.aspx"&gt;Silverlight 4 - MVVM with Commanding and WCF RIA Services&lt;/a&gt; &lt;/li&gt;    	&lt;li&gt;&lt;a href="http://joshsmithonwpf.wordpress.com/2008/03/18/understanding-routed-commands/" title="Understanding Routed Commands &amp;laquo; Josh Smith on WPF"&gt;Understanding Routed Commands &amp;laquo; Josh Smith on WPF&lt;/a&gt; &lt;/li&gt;    	&lt;li&gt;&lt;a href="http://www.dotnetfunda.com/articles/article859-command-binding-in-silverlight-4-stepbystep-.aspx" title="Command Binding in Silverlight 4 (Step-by-Step)"&gt;Command Binding in Silverlight 4 (Step-by-Step)&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Behaviors&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;	   	&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/expression/archive/2009/03/30/behaviors-under-the-hood-api-details-and-constraining-the-type.aspx" title="Behaviors Under the Hood &amp;ndash; API Details and Constraining the Type - Expression Blend and Design -"&gt;Behaviors Under the Hood &amp;ndash; API Details and Constraining the Type&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Best Practices&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;	   	&lt;li&gt;&lt;a href="http://joshsmithonwpf.wordpress.com/2008/11/14/using-a-viewmodel-to-provide-meaningful-validation-error-messages/" title="Using a ViewModel to Provide Meaningful Validation Error Messages &amp;laquo; Josh Smith on WPF"&gt;Using a ViewModel to Provide Meaningful Validation Error Messages&lt;/a&gt; &lt;/li&gt;    	&lt;li&gt;&lt;a href="http://visualstudiomagazine.com/articles/2011/04/01/pfcov_silverlight-mvvm-tips.aspx" title="6 MVVM Tips- Leverage ViewModel and Unit Test Silverlight and WP7 Apps -- Visual Studio Magazine"&gt;6 MVVM Tips- Leverage ViewModel and Unit Test Silverlight and WP7 Apps&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Frameworks&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;	   	&lt;li&gt;&lt;a href="http://waf.codeplex.com/" title="WPF Application Framework (WAF) - Home"&gt;WPF Application Framework (WAF)&lt;/a&gt;&lt;/li&gt;    	&lt;li&gt;&lt;a href="http://compositewpf.codeplex.com/" title="patterns &amp;amp; practices- Prism - Home"&gt;Prism&lt;/a&gt;&lt;/li&gt;    	&lt;li&gt;&lt;a href="http://mvvmlight.codeplex.com/" title="MVVM Light Toolkit"&gt;MVVM Light Toolkit&lt;/a&gt;&lt;/li&gt;    	&lt;li&gt;&lt;a href="http://www.japf.fr/2009/10/a-quick-tour-of-existing-mvvm-frameworks/" title="JAPF &amp;raquo; Blog Archive &amp;raquo; A quick tour of existing MVVM frameworks"&gt;A quick tour of existing MVVM frameworks&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;[ &lt;a href="http://www.twitter.com/scottmarlowe"&gt;Follow me on Twitter&lt;/a&gt; ]&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=U5vcxXf8QJA:k3b30bgD6y4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=U5vcxXf8QJA:k3b30bgD6y4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=U5vcxXf8QJA:k3b30bgD6y4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=U5vcxXf8QJA:k3b30bgD6y4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=U5vcxXf8QJA:k3b30bgD6y4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=U5vcxXf8QJA:k3b30bgD6y4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=U5vcxXf8QJA:k3b30bgD6y4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=U5vcxXf8QJA:k3b30bgD6y4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=U5vcxXf8QJA:k3b30bgD6y4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=U5vcxXf8QJA:k3b30bgD6y4:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsCodingTime/~4/U5vcxXf8QJA" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ItsCodingTime/~3/U5vcxXf8QJA/post.aspx</link>
      <author>scott.nospam@nospam.itscodingtime.com (scottmarlowe)</author>
      <comments>http://www.itscodingtime.com/itscodingtime/post/MVVM-Reference.aspx#comment</comments>
      <guid isPermaLink="false">http://www.itscodingtime.com/itscodingtime/post.aspx?id=51ad9313-c16d-415d-84db-7d5f4b704d40</guid>
      <pubDate>Tue, 17 May 2011 09:15:00 -0500</pubDate>
      <category>Design Patterns</category>
      <dc:publisher>scottmarlowe</dc:publisher>
      <pingback:server>http://www.itscodingtime.com/itscodingtime/pingback.axd</pingback:server>
      <pingback:target>http://www.itscodingtime.com/itscodingtime/post.aspx?id=51ad9313-c16d-415d-84db-7d5f4b704d40</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.itscodingtime.com/itscodingtime/trackback.axd?id=51ad9313-c16d-415d-84db-7d5f4b704d40</trackback:ping>
      <wfw:comment>http://www.itscodingtime.com/itscodingtime/post/MVVM-Reference.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.itscodingtime.com/itscodingtime/syndication.axd?post=51ad9313-c16d-415d-84db-7d5f4b704d40</wfw:commentRss>
    <feedburner:origLink>http://www.itscodingtime.com/itscodingtime/post.aspx?id=51ad9313-c16d-415d-84db-7d5f4b704d40</feedburner:origLink></item>
    <item>
      <title>Change is good</title>
      <description>&lt;p&gt;&lt;img style="margin: 0px 0px 15px 15px; display: inline; float: right" align="right" src="data:image/jpg;base64,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" width="259" height="194" /&gt;Something our former CEO often said as he was announcing the latest round of executive and organizational changes is that in order to stay ahead of the competition you have to change. If you have to change, you're better off doing it from a position of strength rather than when your back is against the wall.&lt;/p&gt;  &lt;p&gt;I'm making some changes of my own, and I'm making them from a position of strength.&lt;/p&gt;  &lt;p&gt;First off, I'm changing employers. As a general rule I don't discuss details about who I work for; no reason to change that policy now. Suffice to say I'm going from a mediocre situation to a brighter, more challenging one.&lt;/p&gt;  &lt;p&gt;The second change is a reduction in the hours I spend consulting outside of my primary job. Late last year I had the opportunity to get back into some software consulting work. The conditions were too good to turn down, but adding all those hours onto a full-time job… it wears you down. This is going to be a slow wind down process as opposed to going cold turkey. I have obligations which will need to be fulfilled before I move on completely. But the end result is I get my life back. I should have more time for writing. More time for reading. More time to play with the dogs, ride my bike, mow the lawn, and, of course, spend time with my wife.&lt;/p&gt;  &lt;p&gt;What this ultimately means for this blog is that I should be a bit more active. It's not often I get to write a single post that applies to &lt;a href="http://www.scottmarlowe.com/twitterlp.aspx"&gt;both of my blogs&lt;/a&gt;, so I find myself essentially addressing two different groups. In terms of my writing blog, I completed the serialization of &lt;a href="http://www.scottmarlowe.com/post/My-Novels.aspx"&gt;The Five Elements&lt;/a&gt;, and at this point I'd like to do some follow-up to discuss the success (or failure) of that effort. On my technical blog, while my new position isn't too terribly different from my current one, I will be focusing a lot more on Silverlight and SharePoint (two very important technologies to my new company), so expect to see the blog's focus go in that direction.&lt;/p&gt;  &lt;p&gt;That's it for now. Looking forward to jumping back into some constructive blogging. Thanks for reading!&lt;/p&gt;  &lt;p&gt;[ &lt;a href="http://www.twitter.com/scottmarlowe"&gt;Follow me on Twitter&lt;/a&gt; ]&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=ybl64JNrSeo:hqUKzk-23cA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=ybl64JNrSeo:hqUKzk-23cA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=ybl64JNrSeo:hqUKzk-23cA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=ybl64JNrSeo:hqUKzk-23cA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=ybl64JNrSeo:hqUKzk-23cA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=ybl64JNrSeo:hqUKzk-23cA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=ybl64JNrSeo:hqUKzk-23cA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=ybl64JNrSeo:hqUKzk-23cA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=ybl64JNrSeo:hqUKzk-23cA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=ybl64JNrSeo:hqUKzk-23cA:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsCodingTime/~4/ybl64JNrSeo" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ItsCodingTime/~3/ybl64JNrSeo/post.aspx</link>
      <author>scott.nospam@nospam.itscodingtime.com (scottmarlowe)</author>
      <comments>http://www.itscodingtime.com/itscodingtime/post/Change-is-good.aspx#comment</comments>
      <guid isPermaLink="false">http://www.itscodingtime.com/itscodingtime/post.aspx?id=80de7500-2666-4bf0-9574-7b6320800f50</guid>
      <pubDate>Fri, 06 May 2011 09:04:41 -0500</pubDate>
      <category>Meta</category>
      <dc:publisher>scottmarlowe</dc:publisher>
      <pingback:server>http://www.itscodingtime.com/itscodingtime/pingback.axd</pingback:server>
      <pingback:target>http://www.itscodingtime.com/itscodingtime/post.aspx?id=80de7500-2666-4bf0-9574-7b6320800f50</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.itscodingtime.com/itscodingtime/trackback.axd?id=80de7500-2666-4bf0-9574-7b6320800f50</trackback:ping>
      <wfw:comment>http://www.itscodingtime.com/itscodingtime/post/Change-is-good.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.itscodingtime.com/itscodingtime/syndication.axd?post=80de7500-2666-4bf0-9574-7b6320800f50</wfw:commentRss>
    <feedburner:origLink>http://www.itscodingtime.com/itscodingtime/post.aspx?id=80de7500-2666-4bf0-9574-7b6320800f50</feedburner:origLink></item>
    <item>
      <title>Windows 7 Explorer Navigation Pane Options</title>
      <description>&lt;p&gt;I&amp;#39;ve been dealing with the most annoying thing since installing Windows 7: when in Explorer and drilling down into folders either via the Favorites section or the right-side file/folder viewing pane, the folder tree doesn&amp;#39;t expand to reflect my current location. Turns out there&amp;#39;s an option to enable this behavior. I&amp;#39;m not sure how long it&amp;#39;s been there or if it was in the initial Windows 7 product (I hope I haven&amp;#39;t been living with this pain all of that time for nothing), but if you go to Folder Options you&amp;#39;ll see a group called &amp;quot;Navigation pane&amp;quot;:&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; margin-top: 20px; margin-right: auto; margin-bottom: 20px; margin-left: auto; padding-left: 0px; padding-right: 0px; display: block; float: none; padding-top: 0px; border-width: 0px" src="/blogpostimages/9ce80de8acb0_61B1/image.png" border="0" alt="Windows Explorer Folder Options" title="Windows Explorer Folder Options" width="396" height="481" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;quot;Show all folders&amp;quot; will display the Recycle Bin (and maybe some other things) in the tree while the other option, &amp;quot;Automatically expand to current folder&amp;quot;, solves the issue at hand.&lt;/p&gt;  &lt;p&gt;Now, when I click on one of my Favorites or start drilling down through folders, the tree always reflects my current location.&lt;/p&gt;  &lt;p&gt;[ &lt;a href="http://www.twitter.com/scottmarlowe"&gt;Follow me on Twitter&lt;/a&gt; ]&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=qu7KhkJFzU0:h76DMNLbxk4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=qu7KhkJFzU0:h76DMNLbxk4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=qu7KhkJFzU0:h76DMNLbxk4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=qu7KhkJFzU0:h76DMNLbxk4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=qu7KhkJFzU0:h76DMNLbxk4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=qu7KhkJFzU0:h76DMNLbxk4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=qu7KhkJFzU0:h76DMNLbxk4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=qu7KhkJFzU0:h76DMNLbxk4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=qu7KhkJFzU0:h76DMNLbxk4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=qu7KhkJFzU0:h76DMNLbxk4:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsCodingTime/~4/qu7KhkJFzU0" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ItsCodingTime/~3/qu7KhkJFzU0/post.aspx</link>
      <author>scott.nospam@nospam.itscodingtime.com (scottmarlowe)</author>
      <comments>http://www.itscodingtime.com/itscodingtime/post/Windows-7-Explorer-Navigation-Pane-Options.aspx#comment</comments>
      <guid isPermaLink="false">http://www.itscodingtime.com/itscodingtime/post.aspx?id=a91f63a2-0b08-4bde-8ddb-ccccb6006ded</guid>
      <pubDate>Mon, 20 Dec 2010 08:25:00 -0500</pubDate>
      <category>Windows 7</category>
      <dc:publisher>scottmarlowe</dc:publisher>
      <pingback:server>http://www.itscodingtime.com/itscodingtime/pingback.axd</pingback:server>
      <pingback:target>http://www.itscodingtime.com/itscodingtime/post.aspx?id=a91f63a2-0b08-4bde-8ddb-ccccb6006ded</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.itscodingtime.com/itscodingtime/trackback.axd?id=a91f63a2-0b08-4bde-8ddb-ccccb6006ded</trackback:ping>
      <wfw:comment>http://www.itscodingtime.com/itscodingtime/post/Windows-7-Explorer-Navigation-Pane-Options.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.itscodingtime.com/itscodingtime/syndication.axd?post=a91f63a2-0b08-4bde-8ddb-ccccb6006ded</wfw:commentRss>
    <feedburner:origLink>http://www.itscodingtime.com/itscodingtime/post.aspx?id=a91f63a2-0b08-4bde-8ddb-ccccb6006ded</feedburner:origLink></item>
    <item>
      <title>The Visual Studio WPF designer does not support abstract classes</title>
      <description>&lt;p&gt;You might want to derive your own custom control class not from UserControl but instead from an abstract class that then inherits from UserControl. This works fine in code such that your hierarchy looks like:&lt;/p&gt;  &lt;blockquote&gt;		   		&lt;p&gt;		UserControl &amp;ndash;&amp;gt; AbstractClass &amp;ndash;&amp;gt; CustomView		&lt;/p&gt;		 &lt;/blockquote&gt;  &lt;p&gt;The problem is that the WPF designer does not support abstract classes:&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; margin-top: 15px; margin-right: auto; margin-bottom: 15px; margin-left: auto; padding-left: 0px; padding-right: 0px; display: block; float: none; padding-top: 0px; border-width: 0px" src="/blogpostimages/f395520f66da_C9F7/image.png" border="0" alt="Cannot create an instance of CustomView" title="Cannot create an instance of CustomView" width="689" height="346" /&gt;&lt;/p&gt;  &lt;p&gt;It&amp;#39;s more of a hassle than anything else because you can&amp;#39;t see your UI.&lt;/p&gt;  &lt;p&gt;There is a workaround for this that I&amp;#39;ve been using. It might not be the only solution, but it seems to do the job.&lt;/p&gt;  &lt;p&gt;In your abstract class, define the class itself as:&lt;/p&gt;  &lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;   &lt;div id="codeSnippet" class="csharpcode"&gt;     &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:&lt;/span&gt; &lt;span class="preproc"&gt;#if&lt;/span&gt; DEBUG&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   2:&lt;/span&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; AbstractClass : UserControl&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:&lt;/span&gt; &lt;span class="preproc"&gt;#else&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   4:&lt;/span&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; AbstractClass : UserControl&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:&lt;/span&gt; &lt;span class="preproc"&gt;#endif&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="CopyToClipboard" style=""&gt;&lt;div&gt;&lt;a href="javascript:void(0);" onclick="CopyToClipboard_ViewPlain(copyToClipboard8ccdf336d5a044209c0408276e04d5bc_1099);"&gt;View Plain&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
					&lt;script type="text/javascript"&gt;
						var copyToClipboard8ccdf336d5a044209c0408276e04d5bc_1099 = CopyToClipboard_Strip('#if DEBUG   2:     public class AbstractClass : UserControl   3: #else   4:     public abstract class AbstractClass : UserControl   5: #endif');
					&lt;/script&gt;&lt;p&gt;In this way, the abstract keyword only comes into play in release code. Yes, it makes it so you can instantiate AbstractClass in debug code, and also you can get away with not implementing virtual methods if the abstract class contains any, but don&amp;#39;t do that. If you do, the compiler will just catch these things as errors when you try to compile release.&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, Tahoma, Helvetica, sans-serif; font-size: 13px; color: #666666; line-height: 19px"&gt;[&amp;nbsp;&lt;a style="color: #4284b0; background-color: inherit; text-decoration: none; padding: 0px; margin: 0px" href="http://www.twitter.com/scottmarlowe"&gt;Follow me on Twitter&lt;/a&gt;&amp;nbsp;]&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=mwjxKJU1mzc:GjlKr_Nifus:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=mwjxKJU1mzc:GjlKr_Nifus:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=mwjxKJU1mzc:GjlKr_Nifus:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=mwjxKJU1mzc:GjlKr_Nifus:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=mwjxKJU1mzc:GjlKr_Nifus:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=mwjxKJU1mzc:GjlKr_Nifus:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=mwjxKJU1mzc:GjlKr_Nifus:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=mwjxKJU1mzc:GjlKr_Nifus:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=mwjxKJU1mzc:GjlKr_Nifus:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=mwjxKJU1mzc:GjlKr_Nifus:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsCodingTime/~4/mwjxKJU1mzc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ItsCodingTime/~3/mwjxKJU1mzc/post.aspx</link>
      <author>scott.nospam@nospam.itscodingtime.com (scottmarlowe)</author>
      <comments>http://www.itscodingtime.com/itscodingtime/post/The-WPF-designer-does-not-support-abstract-classes.aspx#comment</comments>
      <guid isPermaLink="false">http://www.itscodingtime.com/itscodingtime/post.aspx?id=2b4b1584-3d90-4a01-96f3-4315a63e4e13</guid>
      <pubDate>Fri, 29 Oct 2010 14:49:00 -0500</pubDate>
      <category>WPF</category>
      <dc:publisher>scottmarlowe</dc:publisher>
      <pingback:server>http://www.itscodingtime.com/itscodingtime/pingback.axd</pingback:server>
      <pingback:target>http://www.itscodingtime.com/itscodingtime/post.aspx?id=2b4b1584-3d90-4a01-96f3-4315a63e4e13</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.itscodingtime.com/itscodingtime/trackback.axd?id=2b4b1584-3d90-4a01-96f3-4315a63e4e13</trackback:ping>
      <wfw:comment>http://www.itscodingtime.com/itscodingtime/post/The-WPF-designer-does-not-support-abstract-classes.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.itscodingtime.com/itscodingtime/syndication.axd?post=2b4b1584-3d90-4a01-96f3-4315a63e4e13</wfw:commentRss>
    <feedburner:origLink>http://www.itscodingtime.com/itscodingtime/post.aspx?id=2b4b1584-3d90-4a01-96f3-4315a63e4e13</feedburner:origLink></item>
    <item>
      <title>Interface vs. Virtual vs. Abstract</title>
      <description>&lt;p&gt;Sometimes I like to take a step back and look a little harder at something I use almost every day without ever really thinking about it. Take virtual functions, for example, which I was using in C++ long before C# came into existence. C# (and Java) introduced some new keywords to the (somewhat confusing) mix, namely &lt;a href="http://msdn.microsoft.com/en-us/library/ms173156.aspx"&gt;interface&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/sf985hc5.aspx"&gt;abstract&lt;/a&gt;. Think of this post as a refresher on these concepts and their differences.&lt;/p&gt;  &lt;h4&gt;Interface&lt;/h4&gt;  &lt;p&gt;MSDN defines an &lt;a href="http://msdn.microsoft.com/en-us/library/ms173156.aspx"&gt;interface&lt;/a&gt; as consisting of:&lt;/p&gt;  &lt;blockquote&gt;		   		&lt;p&gt;		[&amp;hellip;] methods, properties, events, indexers, or any combination of those four member types. An interface cannot contain constants, fields, operators, instance constructors, destructors, or types. It cannot contain static members. Interfaces members are automatically public, and they cannot include any access modifiers.		&lt;/p&gt;		 &lt;/blockquote&gt;  &lt;p&gt;In addition, an interface type does not define any implementation whatsoever. It is a contract only, requiring derived objects to provide the implementation details. It is not possible therefore to instantiate an interface directly. An interface is very much like a class containing &lt;a href="http://en.wikipedia.org/wiki/Virtual_function#Abstract_classes_and_pure_virtual_functions"&gt;pure virtual functions&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;As a contract, once an interface is locked down you&amp;#39;ll want to minimize changes to it as any change breaks any classes deriving from it.&lt;/p&gt;  &lt;p&gt;As an example, let&amp;#39;s say you want to apply an object model to your pets (if you don&amp;#39;t have pets, why not?). You might start with an interface &amp;quot;IPet&amp;quot;:&lt;/p&gt;  &lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;   &lt;div id="codeSnippet" class="csharpcode"&gt;     &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IPet&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:&lt;/span&gt;     &lt;span class="kwrd"&gt;void&lt;/span&gt; Eat();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   4:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:&lt;/span&gt;     &lt;span class="kwrd"&gt;void&lt;/span&gt; Run();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   6:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:&lt;/span&gt;     &lt;span class="kwrd"&gt;void&lt;/span&gt; Play();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   8:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="CopyToClipboard" style=""&gt;&lt;div&gt;&lt;a href="javascript:void(0);" onclick="CopyToClipboard_ViewPlain(copyToClipboard1d8d06f31baf4634aa9e7184b18fbeb5_1826);"&gt;View Plain&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
					&lt;script type="text/javascript"&gt;
						var copyToClipboard1d8d06f31baf4634aa9e7184b18fbeb5_1826 = CopyToClipboard_Strip('interface IPet   2: {   3:     void Eat();   4:     5:     void Run();   6:     7:     void Play();   8: }');
					&lt;/script&gt;&lt;p&gt;As you can see the IPet interface only defines methods; it doesn&amp;#39;t provide implementation details.&lt;/p&gt;&lt;p&gt;Now let&amp;#39;s provide an implementation class for this interface by deriving an object from it:&lt;/p&gt;&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;&lt;div id="codeSnippet" class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:&lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Dog : IPet&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:&lt;/span&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Eat()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   4:&lt;/span&gt;     {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:&lt;/span&gt;         &lt;span class="rem"&gt;// eat&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   6:&lt;/span&gt;     }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   8:&lt;/span&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Run()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:&lt;/span&gt;     {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  10:&lt;/span&gt;         &lt;span class="rem"&gt;// run&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:&lt;/span&gt;     }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  12:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:&lt;/span&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Play()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  14:&lt;/span&gt;     {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:&lt;/span&gt;         &lt;span class="rem"&gt;// play&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  16:&lt;/span&gt;     }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="CopyToClipboard" style=""&gt;&lt;div&gt;&lt;a href="javascript:void(0);" onclick="CopyToClipboard_ViewPlain(copyToClipboard1d8d06f31baf4634aa9e7184b18fbeb5_3319);"&gt;View Plain&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
					&lt;script type="text/javascript"&gt;
						var copyToClipboard1d8d06f31baf4634aa9e7184b18fbeb5_3319 = CopyToClipboard_Strip('public class Dog : IPet   2: {   3:     public void Eat()   4:     {   5:         // eat   6:     }   7:     8:     public void Run()   9:     {  10:         // run  11:     }  12:    13:     public void Play()  14:     {  15:         // play  16:     }  17: }');
					&lt;/script&gt;&lt;!--CRLF--&gt;&lt;p&gt;As you can see, I&amp;#39;ve derived from IPet and implemented the three interface methods, Eat(), Run(), and Play(). I&amp;#39;m required to implement all three of them because of the contract established by the IPet interface. Not doing so will result in a compiler error. &lt;/p&gt;&lt;h4&gt;Virtual&lt;/h4&gt;&lt;p&gt;The whole point of the &lt;a href="http://msdn.microsoft.com/en-us/library/9fkccyh4(VS.80).aspx"&gt;virtual&lt;/a&gt; keyword is to allow derived classes to override parent functionality and, as objects related by inheritance, for each of those objects to respond differently to the same message (i.e., &lt;a href="http://msdn.microsoft.com/en-us/library/ms173152.aspx"&gt;polymorphism&lt;/a&gt;). Virtual class methods can define implementations, but those implementations can be overridden with the &lt;a href="http://msdn.microsoft.com/en-us/library/ebca9ah3(VS.71).aspx"&gt;override&lt;/a&gt; keyword.&lt;/p&gt;&lt;p&gt;I&amp;#39;ll modify my Dog class so that Play() is virtual:&lt;/p&gt;&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;&lt;div id="codeSnippet" class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:&lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Dog : IPet&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:&lt;/span&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Eat()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   4:&lt;/span&gt;     {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:&lt;/span&gt;         &lt;span class="rem"&gt;// eat&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   6:&lt;/span&gt;     }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   8:&lt;/span&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Run()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:&lt;/span&gt;     {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  10:&lt;/span&gt;         &lt;span class="rem"&gt;// run&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:&lt;/span&gt;     }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  12:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:&lt;/span&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Play()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  14:&lt;/span&gt;     {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:&lt;/span&gt;         &lt;span class="rem"&gt;// play&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  16:&lt;/span&gt;     }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="CopyToClipboard" style=""&gt;&lt;div&gt;&lt;a href="javascript:void(0);" onclick="CopyToClipboard_ViewPlain(copyToClipboard1d8d06f31baf4634aa9e7184b18fbeb5_6575);"&gt;View Plain&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
					&lt;script type="text/javascript"&gt;
						var copyToClipboard1d8d06f31baf4634aa9e7184b18fbeb5_6575 = CopyToClipboard_Strip('public class Dog : IPet   2: {   3:     public void Eat()   4:     {   5:         // eat   6:     }   7:     8:     public void Run()   9:     {  10:         // run  11:     }  12:    13:     public virtual void Play()  14:     {  15:         // play  16:     }  17: }');
					&lt;/script&gt;&lt;p&gt;Then I&amp;#39;ll create a new class called &amp;quot;Labrador&amp;quot; that derives from Dog and uses the override keyword to provide a new implementation of Play() (let&amp;#39;s assume there&amp;#39;s something specific about how labs play that&amp;#39;s different from other dogs):&lt;/p&gt;&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;&lt;div id="codeSnippet" class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Labrador : Dog&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:&lt;/span&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Play()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   4:&lt;/span&gt;     {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:&lt;/span&gt;         &lt;span class="rem"&gt;// labrador playing&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   6:&lt;/span&gt;     }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="CopyToClipboard" style=""&gt;&lt;div&gt;&lt;a href="javascript:void(0);" onclick="CopyToClipboard_ViewPlain(copyToClipboard1d8d06f31baf4634aa9e7184b18fbeb5_9203);"&gt;View Plain&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
					&lt;script type="text/javascript"&gt;
						var copyToClipboard1d8d06f31baf4634aa9e7184b18fbeb5_9203 = CopyToClipboard_Strip('class Labrador : Dog   2: {   3:     public override void Play()   4:     {   5:         // labrador playing   6:     }   7: }');
					&lt;/script&gt;&lt;p&gt;I might have another Dog-derived class called Dalmatian and also override the Play() method there. Given a collection, IList&amp;lt;Dog&amp;gt;, made up of both Labrador and Dalmatian objects, I could iterate through this list, call Play() on each of the Dog objects, and have the overridden implementations called rather than the parent class&amp;#39;s implementation.&lt;/p&gt;&lt;p&gt;Here&amp;#39;s the code to do that:&lt;/p&gt;&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;&lt;div id="codeSnippet" class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:&lt;/span&gt; IList&amp;lt;Dog&amp;gt; dogCollection = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Dog&amp;gt; (4);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   2:&lt;/span&gt; dogCollection.Add (&lt;span class="kwrd"&gt;new&lt;/span&gt; Labrador ());&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:&lt;/span&gt; dogCollection.Add (&lt;span class="kwrd"&gt;new&lt;/span&gt; Dalmatian ());&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   4:&lt;/span&gt; dogCollection.Add (&lt;span class="kwrd"&gt;new&lt;/span&gt; Labrador ());&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:&lt;/span&gt; dogCollection.Add (&lt;span class="kwrd"&gt;new&lt;/span&gt; Dalmatian ());&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   6:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:&lt;/span&gt; &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var dog &lt;span class="kwrd"&gt;in&lt;/span&gt; dogCollection)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   8:&lt;/span&gt; {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:&lt;/span&gt;     dog.Play();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  10:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="CopyToClipboard" style=""&gt;&lt;div&gt;&lt;a href="javascript:void(0);" onclick="CopyToClipboard_ViewPlain(copyToClipboard1d8d06f31baf4634aa9e7184b18fbeb5_10870);"&gt;View Plain&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
					&lt;script type="text/javascript"&gt;
						var copyToClipboard1d8d06f31baf4634aa9e7184b18fbeb5_10870 = CopyToClipboard_Strip('IList&amp;lt;Dog&amp;gt; dogCollection = new List&amp;lt;Dog&amp;gt; (4);   2: dogCollection.Add (new Labrador ());   3: dogCollection.Add (new Dalmatian ());   4: dogCollection.Add (new Labrador ());   5: dogCollection.Add (new Dalmatian ());   6:     7: foreach (var dog in dogCollection)   8: {   9:     dog.Play();  10: }');
					&lt;/script&gt;&lt;p&gt;Putting that code into a console app and adding some Trace WriteLine&amp;#39;s to each of the overridden Play() methods yields:&lt;/p&gt;&lt;p&gt;&lt;img style="margin-top: 20px; margin-right: auto; margin-bottom: 20px; margin-left: auto; display: block; float: none; border-width: 0px" src="/blogpostimages/Interfacevs.Virtualvs.Abstract_A3EB/image.png" border="0" alt="image" title="image" width="166" height="78" /&gt; &lt;/p&gt;&lt;p&gt;This is polymorphism at its best.&lt;/p&gt;&lt;h4&gt;Abstract&lt;/h4&gt;&lt;p&gt;An &lt;a href="http://msdn.microsoft.com/en-us/library/sf985hc5.aspx"&gt;abstract&lt;/a&gt; class can contain both implemented members and non-implemented members. Like an interface, an abstract class cannot be instantiated directly. This means that any derived classes must implement any methods defined as abstract in the parent class. Methods that &lt;em&gt;do&lt;/em&gt; have implementations in the abstract class can be used as-is by child classes or can be overridden &lt;em&gt;if&lt;/em&gt; those methods are defined as virtual.&lt;/p&gt;&lt;p&gt;I modified my Dog class to contain a new abstract method, Chase(), and also made the class abstract since any class that has abstract methods must also be declared abstract.&lt;/p&gt;&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;&lt;div id="codeSnippet" class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:&lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Dog : IPet&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:&lt;/span&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Eat()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   4:&lt;/span&gt;     {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:&lt;/span&gt;         &lt;span class="rem"&gt;// eat&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   6:&lt;/span&gt;     }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   8:&lt;/span&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Run()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:&lt;/span&gt;     {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  10:&lt;/span&gt;         &lt;span class="rem"&gt;// run&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:&lt;/span&gt;     }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  12:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:&lt;/span&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Play()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  14:&lt;/span&gt;     {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:&lt;/span&gt;         &lt;span class="rem"&gt;// play&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  16:&lt;/span&gt;     }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  18:&lt;/span&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Chase();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="CopyToClipboard" style=""&gt;&lt;div&gt;&lt;a href="javascript:void(0);" onclick="CopyToClipboard_ViewPlain(copyToClipboard1d8d06f31baf4634aa9e7184b18fbeb5_13899);"&gt;View Plain&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
					&lt;script type="text/javascript"&gt;
						var copyToClipboard1d8d06f31baf4634aa9e7184b18fbeb5_13899 = CopyToClipboard_Strip('public abstract class Dog : IPet   2: {   3:     public void Eat()   4:     {   5:         // eat   6:     }   7:     8:     public void Run()   9:     {  10:         // run  11:     }  12:    13:     public virtual void Play()  14:     {  15:         // play  16:     }  17:    18:     public abstract void Chase();  19: }');
					&lt;/script&gt;&lt;p&gt;If we take a look at the Labrador class, we can see that we now have to provide an implementation for the Chase() method:&lt;/p&gt;&lt;p&gt;&lt;img style="margin-top: 20px; margin-right: auto; margin-bottom: 20px; margin-left: auto; display: block; float: none; border-width: 0px" src="/blogpostimages/Interfacevs.Virtualvs.Abstract_A3EB/image_3.png" border="0" alt="image" title="image" width="500" height="76" /&gt; &lt;/p&gt;&lt;p&gt;Here&amp;#39;s the Labrador class with the new method:&lt;/p&gt;&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;&lt;div id="codeSnippet" class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:&lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Labrador : Dog&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:&lt;/span&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Play()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   4:&lt;/span&gt;     {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:&lt;/span&gt;         Trace.WriteLine (&lt;span class="str"&gt;&amp;quot;labrador playing&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   6:&lt;/span&gt;     }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   8:&lt;/span&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Chase()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:&lt;/span&gt;     {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  10:&lt;/span&gt;         Trace.WriteLine (&lt;span class="str"&gt;&amp;quot;labrador chasing&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:&lt;/span&gt;     }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  12:&lt;/span&gt; }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="CopyToClipboard" style=""&gt;&lt;div&gt;&lt;a href="javascript:void(0);" onclick="CopyToClipboard_ViewPlain(copyToClipboard1d8d06f31baf4634aa9e7184b18fbeb5_17067);"&gt;View Plain&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
					&lt;script type="text/javascript"&gt;
						var copyToClipboard1d8d06f31baf4634aa9e7184b18fbeb5_17067 = CopyToClipboard_Strip('public class Labrador : Dog   2: {   3:     public override void Play()   4:     {   5:         Trace.WriteLine (&amp;quot;labrador playing&amp;quot;);   6:     }   7:     8:     public override void Chase()   9:     {  10:         Trace.WriteLine (&amp;quot;labrador chasing&amp;quot;);  11:     }  12: }');
					&lt;/script&gt;&lt;p&gt;Abstract differs from virtual in that a virtual method can have an overridable implementation whereas an abstract method has no implementation at all and, as such, abstract methods must be implemented in any derived classes. In effect, an abstract class can have default (non-abstract) implementations that child classes can immediately take advantage of, but also possess abstract methods that a designer wants child classes to have to implement themselves.&lt;/p&gt;&lt;h4&gt;Conclusion&lt;/h4&gt;&lt;p&gt;Given the above, I wish I could say there is a hard and fast rule for using each of the keywords. The truth is that their use is very design dependent. In a general sense, though, one would use an &lt;strong&gt;interface&lt;/strong&gt; when one wants to enforce a contract, the methods of which must be implemented by all derived classes. One would use &lt;strong&gt;virtual&lt;/strong&gt; when one wants to define default implementation details while allowing for the option of derived classes overriding and defining their own implementations. Last, one would use &lt;strong&gt;abstract&lt;/strong&gt; when one wants to provide default implementation details while also forcing derived classes to provide their own implementation of those methods defined as abstract.&lt;/p&gt;&lt;h4&gt;References&lt;/h4&gt;&lt;ul&gt;			&lt;li&gt;Stackoverflow: &lt;a href="http://stackoverflow.com/questions/391483/what-is-the-difference-between-abstract-function-and-virtual-function"&gt;What is the difference between abstract function and virtual function?&lt;/a&gt; &lt;/li&gt;		&lt;li&gt;Stackoverflow: &lt;a href="http://stackoverflow.com/questions/1028285/why-do-both-the-abstract-class-and-interface-exist-in-net"&gt;Why do both the abstract class and interface exist in .Net?&lt;/a&gt; &lt;/li&gt;		&lt;li&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/sf985hc5.aspx"&gt;Abstract&lt;/a&gt; &lt;/li&gt;		&lt;li&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/9fkccyh4(VS.80).aspx"&gt;Virtual&lt;/a&gt; &lt;/li&gt;		&lt;li&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/87d83y5b(VS.80).aspx"&gt;Interface&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;[ &lt;a href="http://www.twitter.com/scottmarlowe"&gt;&lt;font color="#0080ff"&gt;Follow me on Twitter&lt;/font&gt;&lt;/a&gt; ]&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=MWfJ3yudG7Q:h2SxaV5G5eg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=MWfJ3yudG7Q:h2SxaV5G5eg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=MWfJ3yudG7Q:h2SxaV5G5eg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=MWfJ3yudG7Q:h2SxaV5G5eg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=MWfJ3yudG7Q:h2SxaV5G5eg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=MWfJ3yudG7Q:h2SxaV5G5eg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=MWfJ3yudG7Q:h2SxaV5G5eg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=MWfJ3yudG7Q:h2SxaV5G5eg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=MWfJ3yudG7Q:h2SxaV5G5eg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=MWfJ3yudG7Q:h2SxaV5G5eg:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsCodingTime/~4/MWfJ3yudG7Q" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ItsCodingTime/~3/MWfJ3yudG7Q/post.aspx</link>
      <author>scott.nospam@nospam.itscodingtime.com (scottmarlowe)</author>
      <comments>http://www.itscodingtime.com/itscodingtime/post/Interface-vs-Virtual-vs-Abstract.aspx#comment</comments>
      <guid isPermaLink="false">http://www.itscodingtime.com/itscodingtime/post.aspx?id=9c8ab06f-fbe1-4ec1-aefe-e5d13519a7eb</guid>
      <pubDate>Fri, 13 Aug 2010 17:48:00 -0500</pubDate>
      <category>C#</category>
      <category>Programming</category>
      <dc:publisher>scottmarlowe</dc:publisher>
      <pingback:server>http://www.itscodingtime.com/itscodingtime/pingback.axd</pingback:server>
      <pingback:target>http://www.itscodingtime.com/itscodingtime/post.aspx?id=9c8ab06f-fbe1-4ec1-aefe-e5d13519a7eb</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.itscodingtime.com/itscodingtime/trackback.axd?id=9c8ab06f-fbe1-4ec1-aefe-e5d13519a7eb</trackback:ping>
      <wfw:comment>http://www.itscodingtime.com/itscodingtime/post/Interface-vs-Virtual-vs-Abstract.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.itscodingtime.com/itscodingtime/syndication.axd?post=9c8ab06f-fbe1-4ec1-aefe-e5d13519a7eb</wfw:commentRss>
    <feedburner:origLink>http://www.itscodingtime.com/itscodingtime/post.aspx?id=9c8ab06f-fbe1-4ec1-aefe-e5d13519a7eb</feedburner:origLink></item>
    <item>
      <title>SQL Server 2008 Express Silent Command-Line Install</title>
      <description>&lt;p&gt;I have a need to perform a silent, command-line install of SQL Server 2008 Express as a pre-requisite for a server application. While there's an &lt;a href="http://msdn.microsoft.com/en-us/library/ms144259(SQL.100).aspx"&gt;extensive listing of all the many options&lt;/a&gt; available for a command-line install of SQL Server, it still took me a while to sift through what was really needed for a basic, minimal install.&lt;/p&gt;  &lt;p&gt;I should add that I'm using InstallShield and setting SQL Server as one of the pre-req's, but it still requires the command-line switches:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; margin: 20px auto; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.itscodingtime.com/blogpostimages/dda2dc7454b9_92EF/image_4.png" width="606" height="458" /&gt; &lt;/p&gt;  &lt;p&gt;What you're seeing up there is the right way to do it. Before, I only had the &amp;quot;/q&amp;quot; switch, telling SQL Server to run silently. I thought that was enough. Oh, was I wrong. I ran the install, SQL Server &lt;em&gt;looked&lt;/em&gt; like it was doing something, but I kept getting an error dialog from InstallShield saying the SQL Server part of the install did not complete successfully. So, the first thing I did was take a step back and attempt to get just the SQL Server install to run, sans InstallShield, from a plain old command prompt.&lt;/p&gt;  &lt;p&gt;The first step was to, of course, get &lt;a href="http://www.microsoft.com/express/Database/InstallOptions.aspx"&gt;SQL Server Express&lt;/a&gt; (I was letting InstallShield download from the web, and who knows what happened to that copy). You've got several choices; I only wanted the basic database, so I chose the &amp;quot;Database Only&amp;quot; option.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; margin: 20px auto; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.itscodingtime.com/blogpostimages/dda2dc7454b9_92EF/image_3.png" width="610" height="291" /&gt; &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Note that if you're using a plain vanilla VPC like me with a new Windows OS install, you'll likely also need to install &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=5A58B56F-60B6-4412-95B9-54D056D6F9F4&amp;amp;displaylang=en"&gt;Windows Installer 4.5&lt;/a&gt;, which is required by SQL Server.&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;As you're trying to get your command-line setup correctly, one of the best places I found to determine what went wrong when an install didn't work was to look at the log file in the folder &amp;quot;C:\Program Files\Microsoft SQL Server\100\Setup Bootstrap\Log&amp;quot;. Open one of the sub-folders (which are named with the install time) and open the &amp;quot;Summary&amp;quot; text file.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;With Windows Installer and SQL Server Express 2008 installed, here's the command-line I wound up using:&lt;/p&gt;  &lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;   &lt;div id="codeSnippet" class="csharpcode"&gt;     &lt;pre class="alt"&gt;&lt;span id="lnum1" class="lnum"&gt;   1:&lt;/span&gt; SQLEXPR32_x86_ENU.exe /q /&lt;span class="kwrd"&gt;ACTION&lt;/span&gt;=Install /IACCEPTSQLSERVERLICENSETERMS&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum2" class="lnum"&gt;   2:&lt;/span&gt;    /INSTANCENAME=SQLSERVER /&lt;span class="kwrd"&gt;ROLE&lt;/span&gt;=AllFeatures_WithDefaults&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum3" class="lnum"&gt;   3:&lt;/span&gt;    /ADDCURRENTUSERASSQLADMIN=&lt;span class="kwrd"&gt;TRUE&lt;/span&gt; /SQLSVCACCOUNT=&amp;quot;NT AUTHORITY\Network Service&amp;quot;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum4" class="lnum"&gt;   4:&lt;/span&gt;    /FEATURES=&lt;span class="kwrd"&gt;SQL&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div class="CopyToClipboard" style=""&gt;&lt;div&gt;&lt;a href="javascript:void(0);" onclick="CopyToClipboard_ViewPlain(copyToClipboardcda60f3e17664c5280cbbd3ee11062f4_2955);"&gt;View Plain&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
					&lt;script type="text/javascript"&gt;
						var copyToClipboardcda60f3e17664c5280cbbd3ee11062f4_2955 = CopyToClipboard_Strip('SQLEXPR32_x86_ENU.exe /q /ACTION=Install /IACCEPTSQLSERVERLICENSETERMS\r\n   /INSTANCENAME=SQLSERVER /ROLE=AllFeatures_WithDefaults\r\n   /ADDCURRENTUSERASSQLADMIN=TRUE /SQLSVCACCOUNT=&amp;quot;NT AUTHORITY\\Network Service&amp;quot;\r\n   /FEATURES=SQL');
					&lt;/script&gt;

&lt;p&gt;I think it's about as minimalistic as you can get. I'm not so sure about running the sqlserver.exe service under the NETWORK SERVICE account, but that's what I'm going with for the time being. I'll update if I find a recommendation on this, or please leave a comment below if you've got something on this.&lt;/p&gt;

&lt;p&gt;Oddly enough, you can't just take those switches and throw them into InstallShield. You'll get a couple of errors during the SQL Server install if you do (take a look at the SQL log files at &amp;quot;C:\Program Files\Microsoft SQL Server\100\Setup Bootstrap\Log&amp;quot; if you do). So, here are the switches I had to use to keep InstallShield happy:&lt;/p&gt;

&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
  &lt;div id="codeSnippet" class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span id="lnum1" class="lnum"&gt;   1:&lt;/span&gt; /q /&lt;span class="kwrd"&gt;ACTION&lt;/span&gt;=Install /BROWSERSVCSTARTUPTYPE=Automatic /SQLSVCSTARTUPTYPE=Automatic&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alteven"&gt;&lt;span id="lnum2" class="lnum"&gt;   2:&lt;/span&gt;    /FEATURES=&lt;span class="kwrd"&gt;SQL&lt;/span&gt; /INSTANCENAME=SQLEXPRESS /SQLSVCACCOUNT=&amp;quot;NT AUTHORITY\Network Service&amp;quot;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre class="alt"&gt;&lt;span id="lnum3" class="lnum"&gt;   3:&lt;/span&gt;    /SQLSYSADMINACCOUNTS=&amp;quot;BUILTIN\ADMINISTRATORS&amp;quot; /AGTSVCACCOUNT=&amp;quot;NT AUTHORITY\Network Service&amp;quot;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div class="CopyToClipboard" style=""&gt;&lt;div&gt;&lt;a href="javascript:void(0);" onclick="CopyToClipboard_ViewPlain(copyToClipboardcda60f3e17664c5280cbbd3ee11062f4_5015);"&gt;View Plain&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
					&lt;script type="text/javascript"&gt;
						var copyToClipboardcda60f3e17664c5280cbbd3ee11062f4_5015 = CopyToClipboard_Strip('/q /ACTION=Install /BROWSERSVCSTARTUPTYPE=Automatic /SQLSVCSTARTUPTYPE=Automatic\r\n   /FEATURES=SQL /INSTANCENAME=SQLEXPRESS /SQLSVCACCOUNT=&amp;quot;NT AUTHORITY\\Network Service&amp;quot;\r\n   /SQLSYSADMINACCOUNTS=&amp;quot;BUILTIN\\ADMINISTRATORS&amp;quot; /AGTSVCACCOUNT=&amp;quot;NT AUTHORITY\\Network Service&amp;quot;');
					&lt;/script&gt;

&lt;p&gt;[ &lt;a href="http://www.twitter.com/scottmarlowe"&gt;&lt;font color="#0080ff"&gt;Follow me on Twitter&lt;/font&gt;&lt;/a&gt; ]&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=A-YoLD0lhJI:nuHHUj1Izkg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=A-YoLD0lhJI:nuHHUj1Izkg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=A-YoLD0lhJI:nuHHUj1Izkg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=A-YoLD0lhJI:nuHHUj1Izkg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=A-YoLD0lhJI:nuHHUj1Izkg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=A-YoLD0lhJI:nuHHUj1Izkg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=A-YoLD0lhJI:nuHHUj1Izkg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=A-YoLD0lhJI:nuHHUj1Izkg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?i=A-YoLD0lhJI:nuHHUj1Izkg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ItsCodingTime?a=A-YoLD0lhJI:nuHHUj1Izkg:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ItsCodingTime?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ItsCodingTime/~4/A-YoLD0lhJI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ItsCodingTime/~3/A-YoLD0lhJI/post.aspx</link>
      <author>scott.nospam@nospam.itscodingtime.com (scottmarlowe)</author>
      <comments>http://www.itscodingtime.com/itscodingtime/post/SQL-Server-2008-Express-Silent-Command-Line-Install.aspx#comment</comments>
      <guid isPermaLink="false">http://www.itscodingtime.com/itscodingtime/post.aspx?id=d7adc49b-707b-407d-80d8-9160b1656970</guid>
      <pubDate>Wed, 28 Jul 2010 18:28:42 -0500</pubDate>
      <category>SQL Server</category>
      <dc:publisher>scottmarlowe</dc:publisher>
      <pingback:server>http://www.itscodingtime.com/itscodingtime/pingback.axd</pingback:server>
      <pingback:target>http://www.itscodingtime.com/itscodingtime/post.aspx?id=d7adc49b-707b-407d-80d8-9160b1656970</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://www.itscodingtime.com/itscodingtime/trackback.axd?id=d7adc49b-707b-407d-80d8-9160b1656970</trackback:ping>
      <wfw:comment>http://www.itscodingtime.com/itscodingtime/post/SQL-Server-2008-Express-Silent-Command-Line-Install.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.itscodingtime.com/itscodingtime/syndication.axd?post=d7adc49b-707b-407d-80d8-9160b1656970</wfw:commentRss>
    <feedburner:origLink>http://www.itscodingtime.com/itscodingtime/post.aspx?id=d7adc49b-707b-407d-80d8-9160b1656970</feedburner:origLink></item>
  </channel>
</rss>

