<?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:icbm="http://postneo.com/icbm" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" version="2.0">
  <channel>
    <title>Shawn Wildermuth's Blog</title>
    <description>Shawn Wildermuth's Technical Blog</description>
    <icbm:latitude>33.9345</icbm:latitude>
    <icbm:longitude>-84.3426</icbm:longitude>
    <link>http://wildermuth.com/</link>
    <image>
      <title>Shawn Wildermuth</title>
      <url>http://wildermuth.com/images/rssheader.jpg</url>
      <link>http://wildermuth.com/</link>
      <width>88</width>
      <height>31</height>
    </image>
    <language>en-us</language>
    <copyright>Copyright © 2002-2009, Wildermuth Consulting Services, LLC</copyright>
    <managingEditor>shawn@wildermuth.com (Shawn Wildermuth)</managingEditor>
    <webMaster>shawn@wildermuth.com (Shawn Wildermuth)</webMaster>
    <docs>http://backend.userland.com/rss</docs>
    <generator>Wildermuth.com</generator>
    <ttl>60</ttl>
    <geo:lat>33.768205</geo:lat><geo:long>-84.337868</geo:long><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/ShawnWildermuth" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>Second Week of European Conference Tour</title>
      <description>&lt;p&gt;&lt;a href="http://www.silverlight-tour.com"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sdc.nl/" target="_blank"&gt;&lt;img style="float: right;" src="http://www.sdc.nl/Portals/0/SDC-logo.jpg" alt="SDC" width="346" height="55" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Last week I had the pleasure of presenting again at the SDN Conference.&amp;nbsp; I had a great time&amp;nbsp;at the conference. I&amp;nbsp;ended up&amp;nbsp;presenting (or co-presenting) six talks at the conference. The &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; talks were some of my favorites:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Using &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; Validation (&lt;a href="http://wildermuth.com/downloads/sdcbehaviors.zip"&gt;download code&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Creating&amp;nbsp;Behaviors for Silverlight&amp;nbsp;3&amp;nbsp;(&lt;a href="http://wildermuth.com/downloads/sdcbehaviors.zip"&gt;download code&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In addition, I gave a breakout session at the Windows 7 launch (where they gave away 100 copies of Windows 7).&amp;nbsp; My talk at the launch was:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adding Windows 7 Features to Your .NET Applications&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I was able to show off how to create TaskDialogs, Taskbar features like progress, thumbnails and jumplists.&amp;nbsp; I had a lot of fun doing that talk (et lekker!).&lt;/p&gt;
&lt;p&gt;A couple of days before the talk, I noticed that Ted Neward and I had a similar talk on MGrammar so we decided to co-host both sessions. Since &lt;a href='http://msdn.microsoft.com/oslo' target='_blank'&gt;Oslo&lt;/a&gt; is early, there were a lot of skeptics in the rooms; not all did we convert but it did create some very interesting discussion of what is a Domain Specific Language and whether &lt;a href='http://msdn.microsoft.com/oslo' target='_blank'&gt;Oslo&lt;/a&gt; is the key to &lt;a href='http://en.wikipedia.org/wiki/Domain_Specific_Language' target='_blank'&gt;DSLs&lt;/a&gt; in the &lt;a href='http://microsoft.com' target='_blank'&gt;Microsoft&lt;/a&gt; space. The talks I did on &lt;a href='http://msdn.microsoft.com/oslo' target='_blank'&gt;Oslo&lt;/a&gt; included:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Why &lt;a href='http://msdn.microsoft.com/oslo' target='_blank'&gt;Oslo&lt;/a&gt; Matters &lt;/li&gt;
&lt;li&gt;Writing Your First MGrammar (co-presented with Ted Neward) (&lt;a href="http://wildermuth.com/downloads/sdcoslo.zip"&gt;download code&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;The Busy .NET Developer's Guide to &lt;a href='http://en.wikipedia.org/wiki/Domain_Specific_Language' target='_blank'&gt;DSLs&lt;/a&gt; in &lt;a href='http://msdn.microsoft.com/oslo' target='_blank'&gt;Oslo&lt;/a&gt; (co-presented with Ted Neward) (&lt;a href="http://wildermuth.com/downloads/sdcparser.zip"&gt;download code&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of course conferences are not just about doing talks. They are also about visiting with *my* favorite speakers.&amp;nbsp; The usual bunch were there:&lt;/p&gt;
&lt;p&gt;Carl Franklin&lt;/p&gt;
&lt;p&gt;&lt;a title="Carl in Holland by ShawnWildermuth, on Flickr" href="http://www.flickr.com/photos/shawnwildermuth/4047517164/"&gt;&lt;img src="http://farm3.static.flickr.com/2662/4047517164_5a46aeb452.jpg" alt="Carl in Holland" width="409" height="500" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Steve Forte and Richard Campbell&lt;/p&gt;
&lt;p&gt;&lt;a title="Steve and Richard are Tired by ShawnWildermuth, on Flickr" href="http://www.flickr.com/photos/shawnwildermuth/4047520510/"&gt;&lt;img src="http://farm3.static.flickr.com/2462/4047520510_40a9d7ca8d.jpg" alt="Steve and Richard are Tired" width="409" height="500" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Beth Massi&lt;/p&gt;
&lt;p&gt;&lt;a title="Beth in Holland by ShawnWildermuth, on Flickr" href="http://www.flickr.com/photos/shawnwildermuth/4046776013/"&gt;&lt;img src="http://farm4.static.flickr.com/3511/4046776013_fc5a7c2f74.jpg" alt="Beth in Holland" width="320" height="500" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ted likes his soup:&lt;/p&gt;
&lt;p&gt;&lt;a title="Ted Likes Soup by ShawnWildermuth, on Flickr" href="http://www.flickr.com/photos/shawnwildermuth/4046776601/"&gt;&lt;img src="http://farm3.static.flickr.com/2574/4046776601_d6ce7f2a9b.jpg" alt="Ted Likes Soup" width="347" height="500" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Paco Likes Soup too (aka Hadi Hariri)&lt;/p&gt;
&lt;p&gt;&lt;a title="Paco Likes Soup Too by ShawnWildermuth, on Flickr" href="http://www.flickr.com/photos/shawnwildermuth/4047519930/"&gt;&lt;img src="http://farm3.static.flickr.com/2489/4047519930_184016f5df.jpg" alt="Paco Likes Soup Too" width="358" height="500" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Its been a fun time, and almost 1/2 over.&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/10/26/Second_Week_of_European_Conference_Tour'&gt;4 Comment(s)&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f10%2f26%2fSecond_Week_of_European_Conference_Tour&amp;title=Second+Week+of+European+Conference+Tour' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f10%2f26%2fSecond_Week_of_European_Conference_Tour" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/-vKHLary3Ko" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/10/26/Second_Week_of_European_Conference_Tour</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/10/26/Second_Week_of_European_Conference_Tour</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/10/26/Second_Week_of_European_Conference_Tour</guid>
      <pubDate>Mon, 26 Oct 2009 13:43:17 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2806</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2806</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">4</slash:comments>
    </item>
    <item>
      <title>Fun with CollectionViews</title>
      <description>&lt;div nowrap&gt;&lt;strong&gt;URL&lt;/strong&gt;: &lt;a href='http://wildermuth.com/downloads/CollectionViewFun.zip' target=_blank&gt;http://wildermuth.com/downloads/CollectionViewF...&lt;/a&gt;&lt;/div&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://www.silverlight-tour.com"&gt;&lt;img style="float:right;" src="http://wildermuth.com/images/silverlightlogo100.jpg" alt="Silverlight Logo" /&gt;&lt;/a&gt;I've recently been looking at the &lt;strong&gt;PagedCollectionView&lt;/strong&gt; class. For those who are not familiar with this class, it allows you to automatically show sections of a collection in a paged way (especially when paired with the &lt;strong&gt;PagerControl&lt;/strong&gt;). There is a good example on MSDN here:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.pagedcollectionview(VS.95).aspx"&gt;http://msdn.microsoft.com/en-us/library/system.windows.data.pagedcollectionview(VS.95).aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;PagedCollectionView&lt;/strong&gt; class supports the &lt;strong&gt;ICollectionView&lt;/strong&gt; interface that supports a number of features that are really useful for dealing with collections.&amp;nbsp; These include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sorting&lt;/li&gt;
&lt;li&gt;Filtering&lt;/li&gt;
&lt;li&gt;Grouping&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To show this, I decided to start with a simple DataGrid.&amp;nbsp; I created the PagedCollectionView and wrapped my data collection in it like so (GameList is a simple collection of a Game class to show some data):&lt;/p&gt;
&lt;pre&gt;PagedCollectionView view = 
  new PagedCollectionView(new GameList());
&lt;/pre&gt;
&lt;p&gt;Then when data binding, I simple do the binding directly to the view instead of the collection:&lt;/p&gt;
&lt;pre&gt;theGrid.ItemsSource = view;
&lt;/pre&gt;
&lt;p&gt;Using the &lt;strong&gt;PagedCollectionView&lt;/strong&gt; as a wrapper for your collection provides the functionality of sorting, grouping and filtering to your collection. Let's start with sorting.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;ICollectionView&lt;/strong&gt; interface has a SortDescriptions collection that is used to set the sort for the view. For example, to sort our collection by &lt;em&gt;ReleaseDate&lt;/em&gt; then &lt;em&gt;Name&lt;/em&gt;, we can add two SortDescription objects to the collection:&lt;/p&gt;
&lt;pre&gt;view.SortDescriptions.Clear();

view.SortDescriptions.Add(
  new SortDescription("ReleaseDate", 
                      ListSortDirection.Descending));

view.SortDescriptions.Add(
  new SortDescription("ProductName", 
                      ListSortDirection.Ascending));
&lt;/pre&gt;
&lt;p&gt;In our &lt;strong&gt;DataGrid&lt;/strong&gt;, both columns will mark themselves with the sort markers to indicate the search. You can reverse this if you need to detect the changes in sorting that happens when the user clicks on the columns to sort.&amp;nbsp; You can do this by registering for the &lt;strong&gt;CollectionChanged&lt;/strong&gt; event and looking at the &lt;strong&gt;SortDescription&lt;/strong&gt; collection:&lt;/p&gt;
&lt;pre&gt;view.CollectionChanged += view_CollectionChanged;

...

void view_CollectionChanged(object sender, 
  NotifyCollectionChangedEventArgs e)
{
  &lt;strong&gt;foreach (var s in view.SortDescriptions)
  {
    MessageBox.Show(
      string.Concat("Sorting is: ", 
                    s.PropertyName, 
                    " - ", 
                    s.Direction));
  }&lt;/strong&gt;
}
&lt;/pre&gt;
&lt;p&gt;The &lt;strong&gt;ICollectionView&lt;/strong&gt; also exposes the ability to group items in the &lt;strong&gt;DataGrid&lt;/strong&gt;. To add grouping, you simply need to add new &lt;strong&gt;GroupDescription&lt;/strong&gt; objects to the view's &lt;strong&gt;GroupDescription&lt;/strong&gt; list. The only type of &lt;strong&gt;GroupDescription&lt;/strong&gt; that is currently implemented is the &lt;strong&gt;PropertyGroupDescription&lt;/strong&gt; which allows you to group by a property. For example, to group by the &lt;strong&gt;ReleaseDate&lt;/strong&gt; I added a new &lt;strong&gt;PropertyGroupDescription&lt;/strong&gt; like so:&lt;/p&gt;
&lt;pre&gt;view.GroupDescriptions.Add(
  new PropertyGroupDescription("ReleaseDate"));
&lt;/pre&gt;
&lt;p&gt;In the DataGrid, these groups look like so:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://wildermuth.com/images/datagridgroup.png" alt="Grouping" /&gt;&lt;/p&gt;
&lt;p&gt;The last feature I love about the &lt;strong&gt;ICollectionView&lt;/strong&gt; interface is the ability to do arbitrary filtering. The interface has a Filter property that takes a &lt;strong&gt;Predicate&amp;lt;object&amp;gt;&lt;/strong&gt; object.&amp;nbsp; This way we can use a simple lambda to perform filtering.&amp;nbsp; For example, to only show the games that have &lt;a href='http://microsoft.com' target='_blank'&gt;Microsoft&lt;/a&gt; in the name, I just create a simple lambda like so:&lt;/p&gt;
&lt;pre&gt;view.Filter = g =&amp;gt; 
  ((Game)g).Publisher.Contains("Microsoft");&lt;/pre&gt;
&lt;p&gt;Cool, huh?&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/10/25/Fun_with_CollectionViews'&gt;2 Comment(s)&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f10%2f25%2fFun_with_CollectionViews&amp;title=Fun+with+CollectionViews' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f10%2f25%2fFun_with_CollectionViews" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/btrZauAbIgI" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/10/25/Fun_with_CollectionViews</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/10/25/Fun_with_CollectionViews</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/10/25/Fun_with_CollectionViews</guid>
      <pubDate>Sun, 25 Oct 2009 17:06:25 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2805</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2805</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">2</slash:comments>
    </item>
    <item>
      <title>Five Minutes with Me</title>
      <description>&lt;div nowrap&gt;&lt;strong&gt;URL&lt;/strong&gt;: &lt;a href='http://www.cloudcasts.net/ViewWebcast.aspx?webcastid=2521462397756387551' target=_blank&gt;http://www.cloudcasts.net/ViewWebcast.aspx?webc...&lt;/a&gt;&lt;/div&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://www.silverlight-tour.com"&gt;&lt;img style="float:right;" src="http://wildermuth.com/images/stwhead_144.png" alt="Headshot" width="144" height="180" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;While in Bulgaria, I was asked to sit down with Tibu Tiberiu &amp;ldquo;Tibi&amp;rdquo; Covaci for five minutes for a short list of questions. He's released the short podcast and go take a look here if you're interested in hearing what I have to say about the future of technology.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.cloudcasts.net/ViewWebcast.aspx?webcastid=2521462397756387551"&gt;http://www.cloudcasts.net/ViewWebcast.aspx?webcastid=2521462397756387551&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/10/21/Five_Minutes_with_Me'&gt;Add Comment&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f10%2f21%2fFive_Minutes_with_Me&amp;title=Five+Minutes+with+Me' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f10%2f21%2fFive_Minutes_with_Me" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/zNkHMJItHQk" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/10/21/Five_Minutes_with_Me</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/10/21/Five_Minutes_with_Me</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/10/21/Five_Minutes_with_Me</guid>
      <pubDate>Wed, 21 Oct 2009 12:30:21 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2804</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2804</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments>
    </item>
    <item>
      <title>First Week of European Conference Tour</title>
      <description>&lt;p&gt;&lt;img style="float:right;" src="http://farm4.static.flickr.com/3233/2937520795_5fa3293582_m.jpg" alt="Sofia" width="240" height="180" /&gt;&lt;/p&gt;
&lt;p&gt;One week into my European Conference tour and I thought it was time to send you lot a update.&amp;nbsp;My first stop was Sofia, Bulgaria to join the great folks at DevReach.&amp;nbsp;I got in a couple of days early so I could relax and get my time change down.&lt;/p&gt;
&lt;p&gt;The first day I arrived I did the worst thing you can do when you are going to be away for five weeks: I broke my laptop screen. Yeah, I know.&amp;nbsp; Here's a pic of it (click for bigger version):&lt;/p&gt;
&lt;p&gt;&lt;a title="Broken DV7T Screen by ShawnWildermuth, on Flickr" href="http://www.flickr.com/photos/shawnwildermuth/4016791396/"&gt;&lt;img src="http://farm3.static.flickr.com/2456/4016791396_73de891d45.jpg" alt="Broken DV7T Screen" width="500" height="375" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I could try and do my talks with my netbook, but that seemed pretty impossible. So I inquired around and found out that a block away was a computer superstore (kind of a Bulgarian BestBuy). So I figured I just needed to a mid-powered computer that I could use around the office when I get home. One thing that you might not be familiar with is that the Bulgarian language uses Cyrillic alphabet so its very difficult to make out signs and such. At my hotel, the concierge was spectacular. He drove me over (remember, I am still hobbling around on a broken foot) to the store, waited for me and translated inside the store. Just what I needed.&amp;nbsp;I picked up a little Inspiron N1545. Two interesting things about buying this laptop:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Most of the laptops for sale did not come with Windows.&amp;nbsp; Either FreeDOS (yeah, DOS) or Linux (Ubuntu for the Dell).&lt;/li&gt;
&lt;li&gt;The keyboard has Bulgarian alphabet superimposed:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;a title="Bulgarian Keyboard by ShawnWildermuth, on Flickr" href="http://www.flickr.com/photos/shawnwildermuth/4016886196/"&gt;&lt;img src="http://farm3.static.flickr.com/2515/4016886196_500a4997ea.jpg" alt="Bulgarian Keyboard" width="500" height="375" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The broken laptop just has a broken screen, so I was able to use the data on it. In case you don't know it, I actually keep ISOs and installers to repave my entire machine on my harddrive since I pave my machine about every six weeks. It saves me a lot of time (and saved my butt big time in this case). I was able to get the laptop up and running in time to do my first talk at DevReach.&lt;/p&gt;
&lt;p&gt;DevReach treats the speakers really well and is great about taking us out to traditional Bulgarian food.&amp;nbsp; Here's one of the parties with a lot of the usual subjects:&lt;/p&gt;
&lt;p&gt;&lt;a title="DSCN1202 by ShawnWildermuth, on Flickr" href="http://www.flickr.com/photos/shawnwildermuth/4016783872/"&gt;&lt;img src="http://farm4.static.flickr.com/3481/4016783872_df7eea1aae.jpg" alt="DSCN1202" width="500" height="375" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The ever-shy Carl Franklin was able to be coaxed into serenading the entire hotel:&lt;/p&gt;
&lt;p&gt;&lt;a title="DSCN1219 by ShawnWildermuth, on Flickr" href="http://www.flickr.com/photos/shawnwildermuth/4016790128/"&gt;&lt;img src="http://farm3.static.flickr.com/2526/4016790128_ae430e56d9.jpg" alt="DSCN1219" width="500" height="375" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I was able to catch up with the brilliant Tim Huckaby, Richard Campbell, Steve Forte&amp;nbsp;and &lt;a href='http://www.sellsbrothers.com' target='_blank'&gt;Chris Sells&lt;/a&gt; at the event as well.&amp;nbsp; I also got to meet a number of great speakers that I hadn't had the chance to run into before. Its been a lot of fun...except...&lt;/p&gt;
&lt;p&gt;The last day of DevReach I came down with a pretty bad flu.&amp;nbsp;I've spent most of the last couple of days in bed and had to cancel my attendance to the Poland Code Camp in Krakow. I was really disappointed.&lt;/p&gt;
&lt;p&gt;But as of today I am feeling pretty good and looking forward to heading out to the Netherlands in the morning to attend and speak at the SDC conference. I'll be speaking about &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; and Oslo, with a little Windows 7 talk thrown in. If you'll be around, don't be afraid to say hello!&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/10/16/First_Week_of_European_Conference_Tour'&gt;1 Comment(s)&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f10%2f16%2fFirst_Week_of_European_Conference_Tour&amp;title=First+Week+of+European+Conference+Tour' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f10%2f16%2fFirst_Week_of_European_Conference_Tour" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/OCEu0NNN970" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/10/16/First_Week_of_European_Conference_Tour</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/10/16/First_Week_of_European_Conference_Tour</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/10/16/First_Week_of_European_Conference_Tour</guid>
      <pubDate>Fri, 16 Oct 2009 07:37:20 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2803</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2803</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments>
    </item>
    <item>
      <title>I am on .NET Rocks Talking about Declarative UI's</title>
      <description>&lt;div nowrap&gt;&lt;strong&gt;URL&lt;/strong&gt;: &lt;a href='http://www.dotnetrocks.com/default.aspx?ShowNum=489' target=_blank&gt;http://www.dotnetrocks.com/default.aspx?ShowNum...&lt;/a&gt;&lt;/div&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?ShowNum=489"&gt;&lt;img style="float:right;" src="http://wildermuth.com/images/slvideo_dotnetrocks.jpg" alt=".NET Rocks" width="160" height="120" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Before I left for Europe, I had a chance to sit down with Richard and Carl and espouse my views on views. Specifically we discussed how the separation of UIs (in declarative UI's like &lt;a href='http://msdn2.microsoft.com/en-us/library/ms752059.aspx' target='_blank'&gt;XAML&lt;/a&gt; and JavaScript templating) may help developers know specifically when they are in or out of the user interface part of their project. Hopefully this will make it easier to keep our code from getting tangled.&amp;nbsp; Watch out for the bad pizza/spagetti code reference...&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/10/13/I_am_on_NET_Rocks_Talking_about_Declarative_UI_s'&gt;2 Comment(s)&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f10%2f13%2fI_am_on_NET_Rocks_Talking_about_Declarative_UI_s&amp;title=I+am+on+.NET+Rocks+Talking+about+Declarative+UI's' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f10%2f13%2fI_am_on_NET_Rocks_Talking_about_Declarative_UI_s" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/VmWfNOSfU6s" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/10/13/I_am_on_NET_Rocks_Talking_about_Declarative_UI_s</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/10/13/I_am_on_NET_Rocks_Talking_about_Declarative_UI_s</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/10/13/I_am_on_NET_Rocks_Talking_about_Declarative_UI_s</guid>
      <pubDate>Tue, 13 Oct 2009 05:29:43 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2802</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2802</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">2</slash:comments>
    </item>
    <item>
      <title>What Do We Want in Silverlight Validation?</title>
      <description>&lt;div nowrap&gt;&lt;strong&gt;URL&lt;/strong&gt;: &lt;a href='http://niagara.codeplex.com' target=_blank&gt;http://niagara.codeplex.com&lt;/a&gt;&lt;/div&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://niagara.codeplex.com"&gt;&lt;img style="float:right;" src="http://www.atlantic-cable.com/Cableships/Niagara/CM-Niagara_s.jpg" alt="Niagara Project" width="300" height="199" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As I've been on the mend lately, i've been looking deep into how Validation should work in &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt;. As I am trying to expand some of hte validation scenarios in &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; (in my Niagara project), I'd like to see how you are feeling about Validaiton.&lt;/p&gt;
&lt;p&gt;Currently (as my &lt;a href="http://wildermuth.com/2009/09/28/How_Silverlight_3_Validation_Works"&gt;previous post &lt;/a&gt;mentioned), the current validation stack is pretty tightly coupled to RIA Services (though with some work you can get it working with other data stacks).&amp;nbsp; But the question is really which validation stack does &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; really need. Let's discuss the two I've been looking at: DataAnnotations and Enterprise Libraries' Validation Application Block.&lt;/p&gt;
&lt;h2&gt;DataAnnotations&lt;/h2&gt;
&lt;p&gt;Let's talk history. Back in .NET 3.5 SP1 (ok, I know many of you are still in .NET 2.0, my apologies), the DataAnnotations assembly was shipped. My assumption that this was to accomodate the newly christened Dynamic Data Web projects. Dynamic Data needed a way to communicate information it couldn't discern (like required fields, string length, etc.) The way that it did this was via a set of attributes in the &lt;strong&gt;System.ComponentModel.DataAnnotations&lt;/strong&gt;. For example:&lt;/p&gt;
&lt;pre&gt;public class GameInfo
{
  [Required]
  [StringLength(100)]
  public string Name { get; set; }

  [Range(0d, 1000d)]
  public decimal Price { get; set; }
}&lt;/pre&gt;
&lt;p&gt;The problem with this approach was that in most cases, the classes were generated via an &lt;a href='http://en.wikipedia.org/wiki/Object-relational_mapping' target='_blank'&gt;ORM&lt;/a&gt; (&lt;a href='http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx' target='_blank'&gt;LINQ&lt;/a&gt; to SQL, Entity Framework, etc.) and adding these attributes on generated code just doesn't work. So someone came up with a workaround (or&amp;nbsp;a hack if you prefer): the Metadata Type.&lt;/p&gt;
&lt;p&gt;The idea behind a metadata type was that with partial types, users can add attributes to a class (but not a property) so by adding an attribute to each entity class that said, the metadata (e.g. validation attributes) for this class are stored in this metadata type that is never used except as a payload for the metadata about our entity.&amp;nbsp; For example:&lt;/p&gt;
&lt;pre&gt;&lt;strong&gt;[MetadataType(typeof(Game.GameMetadata))]&lt;/strong&gt;
public partial class Game
{
  internal sealed class GameMetadata
  {
    // Metadata classes are not meant to be instantiated.
    private GameMetadata()
    {
    }

    public string Description;

    public string Developer;

    public EntityState EntityState;

    public int GameID;

    public Genre TheGenre;

    public string ImageUrl;

   &lt;strong&gt; [Required]&lt;/strong&gt;
    &lt;strong&gt;[StringLength(100)]
&lt;/strong&gt;    public string Name;

    &lt;strong&gt;[Range(0d, 2000d)]&lt;/strong&gt;
    public Nullable Price;

    public string Publisher;

    public Rating TheRating;

    public Nullable ReleaseDate;
  }
}
&lt;/pre&gt;
&lt;p&gt;Early on, using the metadata classes to add these bits of data may have made sense because the sites you were creating were quick and dirty data editing sites. The problem is that this stack was adopted by RIA Services to allow for better validation in the &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; space (and eventually other platforms).&lt;/p&gt;
&lt;p&gt;The DataAnnotations in RIA Services are a bit fractured as well. There are no less than three versions of the DataAnnotations that can cause confusion. The atttributes lists are different in these three versions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.NET 3.5 SP1's System.ComponentModel.DataAnnotations&lt;/li&gt;
&lt;li&gt;RIA Services's System.ComponentModel.DataAnnotations&lt;/li&gt;
&lt;li&gt;Silverlight's System.ComponentModel.DataAnnotations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The three versions can cause some confusion as the attributes that you can use are duplicative (See .NET 3.5 SP1's Description attribute versus RIA Service's as an example).&lt;/p&gt;
&lt;p&gt;The current &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; validation stack relies on exceptions to be thrown during set property setters (or you can validate the whole objects yourself). While this works, it does seem at odd with the work at hand and having a simple Validation model that returned results would be better IMHO. I understand that RIA Services was trying to fit into an existing &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; model but that doesn't mean I have to like it.&lt;/p&gt;
&lt;p&gt;This stack may be good enough, especially with the ability to do custom validation with RIA Services but I sense that it may be too shallow for real validation.&lt;/p&gt;
&lt;h2&gt;Enterprise Library's Validation Application Block&lt;/h2&gt;
&lt;p&gt;On the other side of the coin is the Patterns and Practice team's Validation Application Block (VAB). This is a set of code that allows you to specify validation using either attributes or configuration files.&amp;nbsp;While the Validation Application Block doesn't support &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; directly, I've been investigating it as an alternative design.&lt;/p&gt;
&lt;p&gt;The Validation Application Block's design is focused on some of the same principals as the DataAnnotations but they were trying to solve some different problems.&amp;nbsp; Some of the features of that design that may be of use in &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multi-level validation (e.g. Validates with And/or clauses: "NULL or StringLength 5-25")&lt;/li&gt;
&lt;li&gt;Configuration doesn't rely on attributes but can use them&lt;/li&gt;
&lt;li&gt;Uses a provider model for specifying the validation so other sources of validation metadata are possible&lt;/li&gt;
&lt;li&gt;Large number of built-in validations&lt;/li&gt;
&lt;li&gt;Support for multiple sets of validation (RuleSets)&lt;/li&gt;
&lt;li&gt;Validation is object-based to allow for cross validation (Either Name or CompanyName but not be null).&lt;/li&gt;
&lt;li&gt;Fail-over validation detection (e.g. look for attributes, if not found look up configuration, etc.)&lt;/li&gt;
&lt;li&gt;Validation returns simple ValidationResults which can be parsed or shown to the user. No Exceptions requried.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example a typical attribute scenario for validation looks a lot like the RIA Services' approach:&lt;/p&gt;
&lt;pre&gt;[StringLengthValidator(1, 50, 
  Ruleset="RuleSetA", 
  MessageTemplate="First Name must be between 1 and 50 characters")]
public string FirstName
{
    get { return firstName; }
    set { firstName = value;  }
}

[StringLengthValidator(1, 50, 
  Ruleset = "RuleSetA", 
  MessageTemplate = "Last Name must be between 1 and 50 characters")]
public string LastName
{
    get { return lastName; }
    set { lastName = value; }
}

[RelativeDateTimeValidator(-120, 
  DateTimeUnit.Year, -18, DateTimeUnit.Year, 
  Ruleset="RuleSetA", 
  MessageTemplate="Must be 18 years or older.")]
public DateTime DateOfBirth
{
    get { return dateOfBirth; }
    set { dateOfBirth = value; }
}

[RegexValidator(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", 
  MessageTemplate="Invalid e-mail address", 
  Ruleset = "RuleSetA")]
public string Email
{
    get { return email; }
    set { email = value; }
}

[ObjectValidator("RuleSetA", Ruleset = "RuleSetA")]
public Address Address
{
    get { return address; }
    set { address = value; }
}

[RangeValidator(0, RangeBoundaryType.Inclusive, 
  1000000, 
  RangeBoundaryType.Inclusive, 
  Ruleset = "RuleSetA", 
  MessageTemplate="Rewards points cannot exceed 1,000,000")]
public int RewardPoints
{
    get { return rewardPoints; }
    set { rewardPoints = value; }
}
&lt;/pre&gt;
&lt;p&gt;In addition it supports a configuration-based solution:&lt;/p&gt;
&lt;pre&gt; &amp;lt;validation&amp;gt;
    &amp;lt;type assemblyName="ValidationQuickStart.BusinessEntities, 
                        Version=1.0.0.0, 
                        Culture=neutral, PublicKeyToken=null"
          name="ValidationQuickStart.BusinessEntities.Address"&amp;gt;
      &amp;lt;ruleset name="RuleSetB"&amp;gt;
        &amp;lt;properties&amp;gt;
          &amp;lt;property name="City"&amp;gt;
            &amp;lt;validator lowerBound="1"
                       lowerBoundType="Inclusive"
                       upperBound="30"
                       upperBoundType="Inclusive"
                       negated="false"
                       messageTemplate=""
                       messageTemplateResourceName=""
                       messageTemplateResourceType=""
                       tag=""
                       type="Microsoft.Practices.EnterpriseLibrary.
                         Validation.Validators.StringLengthValidator, 
                         &lt;a href='http://microsoft.com' target='_blank'&gt;Microsoft&lt;/a&gt;.Practices.EnterpriseLibrary.Validation"
                       name="String Length Validator" /&amp;gt;
            &amp;lt;validator characterSet="1234567890!@#$%^&amp;amp;*()-="
                       containsCharacter="Any"
                       negated="true"
                       messageTemplate="City may not contain numbers"
                       messageTemplateResourceName=""
                       messageTemplateResourceType=""
                       tag=""
                       type="Microsoft.Practices.EnterpriseLibrary.Validation.
                         Validators.ContainsCharactersValidator, 
                         &lt;a href='http://microsoft.com' target='_blank'&gt;Microsoft&lt;/a&gt;.Practices.EnterpriseLibrary.Validation"
                       name="Contains Characters Validator" /&amp;gt;
            &amp;lt;validator negated="false"
                       messageTemplate=""
                       messageTemplateResourceName=""
                       messageTemplateResourceType=""
                       tag=""
                       type="Microsoft.Practices.EnterpriseLibrary.Validation.
                         Validators.NotNullValidator, 
                         &lt;a href='http://microsoft.com' target='_blank'&gt;Microsoft&lt;/a&gt;.Practices.EnterpriseLibrary.Validation"
                       name="Not Null Validator" /&amp;gt;
          &amp;lt;/property&amp;gt;
      &amp;lt;/ruleset&amp;gt;
    &amp;lt;/type&amp;gt;
  &amp;lt;/ruleset&amp;gt;
&amp;lt;/validation&amp;gt;&lt;/pre&gt;
&lt;p&gt;This syntax while it works, its pretty terse and unreadable (as configuration tends to be). But it is decoupled which is nice.&lt;/p&gt;
&lt;p&gt;While many of these features are laudable, it feels a bit over-engineered and complex.&amp;nbsp; The VAB uses Validators for a number of cases where its just a grouping technique so debugging individual validations can be complex.&lt;/p&gt;
&lt;h2&gt;"Just Right?"&lt;/h2&gt;
&lt;p&gt;So here is where I put it to you, my readers:&lt;/p&gt;
&lt;p&gt;"What do you need in Silverlight?"&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is the RIA Stack good enough? &lt;/li&gt;
&lt;li&gt;Do you want validation regardless of what the transport is (&lt;a href='http://msdn.microsoft.com/data' target='_blank'&gt;ADO.NET&lt;/a&gt; Data Services, WCF, REST)? &lt;/li&gt;
&lt;li&gt;Is&amp;nbsp;using &amp;nbsp;RIA Services' CustomValidation with method name good enough for custom scenarios?&lt;/li&gt;
&lt;li&gt;Do you need complex validation (where AND/OR validation is necessary)?&lt;/li&gt;
&lt;li&gt;How important is decoupling your validation metadata from the model?&lt;/li&gt;
&lt;li&gt;Do you detest metadata types or is it just a necessary evil?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Please comment here so we can start a dialogue to help me understand what the development community is thinking about validation.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/10/05/What_Do_We_Want_in_Silverlight_Validation'&gt;14 Comment(s)&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f10%2f05%2fWhat_Do_We_Want_in_Silverlight_Validation&amp;title=What+Do+We+Want+in+Silverlight+Validation%3f' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f10%2f05%2fWhat_Do_We_Want_in_Silverlight_Validation" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/7sRl8b6P0Bk" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/10/05/What_Do_We_Want_in_Silverlight_Validation</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/10/05/What_Do_We_Want_in_Silverlight_Validation</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/10/05/What_Do_We_Want_in_Silverlight_Validation</guid>
      <pubDate>Mon, 05 Oct 2009 14:26:57 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2801</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2801</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">14</slash:comments>
    </item>
    <item>
      <title>Speaking at TechEd Europe!</title>
      <description>&lt;div nowrap&gt;&lt;strong&gt;URL&lt;/strong&gt;: &lt;a href='http://www.microsoft.com/europe/teched/' target=_blank&gt;http://www.microsoft.com/europe/teched/&lt;/a&gt;&lt;/div&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://www.microsoft.com/europe/teched/"&gt;&lt;img style="float:right;" src="http://wildermuth.com/images/teched2009.png" alt="TechEd Europe 2009" width="195" height="97" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I am excited to be asked to speak in Berlin this November at TechEd Europe 2009. This event is happening November 9-13th in Berlin, Germany. If you have a chance, it'll be a great time to see and be seen. There are a lot of great speakers that are all a must-see (humbling a bit).&lt;/p&gt;
&lt;p&gt;I'll be doing two talks and participating in a panel:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Securing &lt;a href='http://microsoft.com' target='_blank'&gt;Microsoft&lt;/a&gt; Silverlight: Knowing the Enemy&lt;/li&gt;
&lt;li&gt;Architecting &lt;a href='http://microsoft.com' target='_blank'&gt;Microsoft&lt;/a&gt; &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; Applications with MVVM&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The panel is "Everything You Always Wanted to Know about &lt;a href='http://microsoft.com' target='_blank'&gt;Microsoft&lt;/a&gt; Silverlight, But Were Afraid to Ask" with Tim Heuer, Oliver Scheer and Damir Tomicic (and me!)&lt;/p&gt;
&lt;p&gt;Bring your toughest questions...&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/10/04/Speaking_at_TechEd_Europe!'&gt;1 Comment(s)&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f10%2f04%2fSpeaking_at_TechEd_Europe!&amp;title=Speaking+at+TechEd+Europe!' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f10%2f04%2fSpeaking_at_TechEd_Europe!" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/hnJ3nVvJ-5c" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/10/04/Speaking_at_TechEd_Europe!</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/10/04/Speaking_at_TechEd_Europe!</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/10/04/Speaking_at_TechEd_Europe!</guid>
      <pubDate>Sun, 04 Oct 2009 19:02:27 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2800</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2800</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments>
    </item>
    <item>
      <title>My Favorite Silverlight Extensions APIs - Part 1</title>
      <description>&lt;div nowrap&gt;&lt;strong&gt;URL&lt;/strong&gt;: &lt;a href='http://slextensions.codeplex.com' target=_blank&gt;http://slextensions.codeplex.com&lt;/a&gt;&lt;/div&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://www.silverlight-tour.com"&gt;&lt;img style="float:right;" src="http://wildermuth.com/images/silverlightlogo200.jpg" alt="Silverlight" /&gt;&lt;/a&gt;As some of you may know, I am a contributor to the&amp;nbsp;&lt;a href="http://silverlightcontrib.codeplex.com"&gt;SilverlightContrib&lt;/a&gt; open source project. Recently this project and the &lt;a href="http://slextensions.codeplex.com"&gt;Silverlight Extensions&lt;/a&gt;&amp;nbsp;open source project&amp;nbsp;(also know as SLExtensions) decided to merge to create a single place for a lot of interesting functionality.&lt;/p&gt;
&lt;p&gt;I want to highlight some of the pieces that I &lt;strong&gt;didn't&lt;/strong&gt; contribute as I've seen a lot of really great functionality for those of you who are building &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; Applications.&amp;nbsp; I honestly have no idea how many parts this blog series will be, as long as I have parts that are interesting, I'll continue to post about them.&lt;/p&gt;
&lt;p&gt;First up is SLExtension's Bootstrapper functionality. If you are currently using Prism or a related technology to compose your application at runtime, this functionality is lost on you. The Bootstrapper functionality is for that middle-ground where you want to break up your project into a small number of .xap files that are loaded when the project loads up but don't need a full composition engine with MEF or Prism.&lt;/p&gt;
&lt;p&gt;The Bootstrapper functionality is in a separately assembly in the SLExtensions project (SLExtensions.Bootstrapping.dll). This is a small assembly (so that your main project loads fast). The way it works is to have you change the derived class for the App.xaml to a &lt;strong&gt;BootstrapApplication:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;public partial class App : &lt;strong&gt;BootstrapApplication&lt;/strong&gt;
{
&lt;/pre&gt;
&lt;p&gt;Since its the App.xaml class, you'll need to change the &lt;a href='http://msdn2.microsoft.com/en-us/library/ms752059.aspx' target='_blank'&gt;XAML&lt;/a&gt; as well:&lt;/p&gt;
&lt;pre&gt;&amp;lt;&lt;strong&gt;bs:BootstrapApplication &lt;/strong&gt;
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="FunWithBootstrapper.App"
  &lt;strong&gt;xmlns:bs&lt;/strong&gt;="&lt;strong&gt;clr-namespace:SLExtensions.Bootstrapping;&lt;/strong&gt;
            &lt;strong&gt;assembly=SLExtensions.Bootstrapping&lt;/strong&gt;"&amp;gt;
  &amp;lt;&lt;strong&gt;bs:BootstrapApplication&lt;/strong&gt;.Resources&amp;gt;

  &amp;lt;/&lt;strong&gt;bs:BootstrapApplication&lt;/strong&gt;.Resources&amp;gt;
&amp;lt;/&lt;strong&gt;bs:BootstrapApplication&lt;/strong&gt;&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Once you have the application changed, you will need to override the Xaps property to supply the list of XAP files to load:&lt;/p&gt;
&lt;pre&gt;protected override IEnumerable&amp;lt;Uri&amp;gt; Xaps
{
  get
  {
    // Must be absolute Uris so we steal it from the host
   &lt;strong&gt; return new Uri[] { 
      new Uri(new Uri(Host.Source.AbsoluteUri), "SecondApp.xap"),
      new Uri(new Uri(Host.Source.AbsoluteUri), "ThirdApp.xap"),
    };&lt;/strong&gt;
  }
}
&lt;/pre&gt;
&lt;p&gt;At this point it will load up the other .xap files but we won't be able to do anything with them. So let's look at the other projects briefly.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://wildermuth.com/images/bootstrap_1.png" alt="The other &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; Projects" /&gt;&lt;/p&gt;
&lt;p&gt;The other &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; projects are actually full &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; Applications (not Client Library projects). The Bootstrapper is usually used to create a 'splash screen' xap file that loads the other parts of the applications.&amp;nbsp; Again, not real composition like Prism, but something less than that.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://wildermuth.com/images/bootstrap_2.png" alt="Project Reference Dialog" /&gt;&lt;/p&gt;
&lt;p&gt;In the main project, you will make a reference to the other application projects. That's how you'll be able to reference the code from the other xap files (though only once they've been loaded).&lt;/p&gt;
&lt;p&gt;To help you know when its updated, the Bootstrapper application has two facilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Progress event&lt;/li&gt;
&lt;li&gt;OnApplicationReady overridable method&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now that you have a bootstrapping application, you want to be able to work with it. The first thing I usually do (because I want to use the Bootstrapping API's from anywhere without casting) is create a new static property on the Application class:&lt;/p&gt;
&lt;pre&gt;// Better access to the bootstrapping app
public static App MyApp
{
  get { return Current as App; }
}
&lt;/pre&gt;
&lt;p&gt;Then I can use the Progress event to show the user some progress like so:&lt;/p&gt;
&lt;pre&gt;void MainPage_Loaded(object sender, RoutedEventArgs e)
{
  App.MyApp.&lt;strong&gt;Progress&lt;/strong&gt; += 
    new EventHandler&amp;lt;BootstrapEventArgs&amp;gt;(&lt;strong&gt;Bootstrap_Progress&lt;/strong&gt;);
}

void &lt;strong&gt;Bootstrap_Progress&lt;/strong&gt;(object sender, BootstrapEventArgs e)
{
  thePartProgress.Value = e.StepProgress;
  theFullProgress.Value = e.OverallProgress;
}&lt;/pre&gt;
&lt;p&gt;I'd like to be able to know when the application is completely loaded too. Unfortunately the Progress event tends to not return 100% at any time.&amp;nbsp; I haven't figured out why yet, but to get around that you can use the OnApplicationReady overridable method:&lt;/p&gt;
&lt;pre&gt;public partial class App : BootstrapApplication
{
  ...
  
  protected override void &lt;strong&gt;OnApplicationReady&lt;/strong&gt;(StartupEventArgs e)
  {
    // Do startup behavior
  }
  
  ...
}&lt;/pre&gt;
&lt;p&gt;While this works, I often don't want to do this work in the App class, but instead in other parts of my application (e.g. MainForm.xaml.cs). So For my use, I usually expose an event as well:&lt;/p&gt;
&lt;pre&gt;public event EventHandler&amp;lt;StartupEventArgs&amp;gt; &lt;strong&gt;StartupComplete&lt;/strong&gt;;

protected override void OnApplicationReady(StartupEventArgs e)
{
 &lt;strong&gt; if (StartupComplete != null)
  {
    StartupComplete(this, e);
  }&lt;/strong&gt;
}&lt;/pre&gt;
&lt;p&gt;By throwing an event when the application is ready, I can register for this event and do the startup once I know all the code is available:&lt;/p&gt;
&lt;pre&gt;// MainPage.xaml.cs
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
  App.MyApp.Progress += 
    new EventHandler&amp;lt;BootstrapEventArgs&amp;gt;(Bootstrap_Progress);

  &lt;strong&gt;App.MyApp.StartupComplete += &lt;/strong&gt;
    &lt;strong&gt;new EventHandler&amp;lt;StartupEventArgs&amp;gt;(Bootstrap_StartupComplete);&lt;/strong&gt;
}

void Bootstrap_StartupComplete(object sender, StartupEventArgs e)
{
&lt;strong&gt;  // Use the loaded types 
  // (SecondApp.MainPage and ThirdApp.MainPage)
  theSecondApp.Children.Add(new SecondApp.MainPage());
  theThirdApp.Children.Add(new ThirdApp.MainPage());
&lt;/strong&gt;}&lt;/pre&gt;
&lt;p&gt;Note that once the bootstrapping has completed you can use the assemblies in the other .xap projects. If you attempt to use them before, you'll get an exception that it couldn't load the type.&lt;/p&gt;
&lt;p&gt;Just to prove the point, here is a list of the .xap files.&amp;nbsp; Notice that the 2nd and 3rd .xap file are pretty big but even with the bootstrapping assembly, our code is only 10K which means it should load very fast:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://wildermuth.com/images/bootstrap_3.png" alt="Relative XAP Sizes" /&gt;&lt;/p&gt;
&lt;p&gt;Neat?&amp;nbsp; What do you think?&lt;/p&gt;
&lt;p&gt;You can get the source to my example here:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://wildermuth.com/downloads/FunWithBootstrapper.zip"&gt;http://wildermuth.com/downloads/FunWithBootstrapper.zip&lt;/a&gt; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/10/04/My_Favorite_Silverlight_Extensions_APIs_-_Part_1'&gt;8 Comment(s)&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f10%2f04%2fMy_Favorite_Silverlight_Extensions_APIs_-_Part_1&amp;title=My+Favorite+Silverlight+Extensions+APIs+-+Part+1' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f10%2f04%2fMy_Favorite_Silverlight_Extensions_APIs_-_Part_1" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/0exAEyQcUNA" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/10/04/My_Favorite_Silverlight_Extensions_APIs_-_Part_1</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/10/04/My_Favorite_Silverlight_Extensions_APIs_-_Part_1</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/10/04/My_Favorite_Silverlight_Extensions_APIs_-_Part_1</guid>
      <pubDate>Sun, 04 Oct 2009 18:17:21 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2799</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2799</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">8</slash:comments>
    </item>
    <item>
      <title>No longer a C# MVP...</title>
      <description>&lt;div nowrap&gt;&lt;strong&gt;URL&lt;/strong&gt;: &lt;a href='https://mvp.support.microsoft.com/profile/Shawn.Wildermuth' target=_blank&gt;https://mvp.support.microsoft.com/profile/Shawn...&lt;/a&gt;&lt;/div&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://www.silverlight-tour.com"&gt;&lt;img style="float:right;" src="http://wildermuth.com/images/MVPLogo_w.jpg" alt="MVP" width="150" height="61" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Eight long years ago I was presented with my very first MVP. In those days I was a .NET MVP, the only designation for anyone doing .NET. Yeah, I am getting old ;)&lt;/p&gt;
&lt;p&gt;A couple of years later they retired the .NET designation and separated the .NET MVP's into a number of groups. In those days I was "The ADO Guy" and none of the groups seemed like a good fit so I fell into being C# MVP. I chose C# mostly because I was doing WinForms, WebForms, SOA, Databases, etc. And nothing really crossed all those boundaries.&lt;/p&gt;
&lt;p&gt;Of course the last few years I've been focused on &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; and the Silvelright Tour. I was approached last year to change my designation to a &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; MVP but again I was doing so many things that &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; felt too limiting...&lt;/p&gt;
&lt;p&gt;That brings us to today. Behind the scenes for a few years I've been lobbying for a designation for those of us who are like me: we care about data. I have my hands in Silverlight, but my passion in is data (as it relates to Silerlight and other platforms). I write about &lt;a href='http://msdn.microsoft.com/data' target='_blank'&gt;ADO.NET&lt;/a&gt; Data Services, RIA Services, Web Services, etc. This year they've finally created our niche: Data Platform Development MVP (which I will just say MVP (Data) for simplicity). This means that while I am no longer a "C# MVP", I am a "Data MVP" and I am proud&amp;nbsp;to be in this program, again!&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/10/01/No_longer_a_C_MVP'&gt;8 Comment(s)&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f10%2f01%2fNo_longer_a_C_MVP&amp;title=No+longer+a+C%23+MVP...' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f10%2f01%2fNo_longer_a_C_MVP" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/wMofFcYmR_I" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/10/01/No_longer_a_C_MVP</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/10/01/No_longer_a_C_MVP</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/10/01/No_longer_a_C_MVP</guid>
      <pubDate>Thu, 01 Oct 2009 12:48:15 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2798</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2798</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">8</slash:comments>
    </item>
    <item>
      <title>Less Than Two Weeks Left Before Silverilght Tour in Miami!</title>
      <description>&lt;div nowrap&gt;&lt;strong&gt;URL&lt;/strong&gt;: &lt;a href='http://agilitrain.com/workshop/info/Silverlight_Tour_Workshop' target=_blank&gt;http://agilitrain.com/workshop/info/Silverlight...&lt;/a&gt;&lt;/div&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://www.silverlight-tour.com/"&gt;&lt;img style="FLOAT: right" src="http://wildermuth.com/images/stlogo.png" alt="Silverlight Tour" width="234" height="100" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Are you ready...for &lt;a href="http://wildermuth.com/silverlight" target="_blank"&gt;&lt;strong&gt;Silverlight&lt;/strong&gt;&lt;/a&gt; 3? If not, now's your time to ramp up in three days.&amp;nbsp; The &lt;a href="http://www.silverlight-tour.com/" target="_blank"&gt;&lt;strong&gt;Silverlight Tour&lt;/strong&gt;&lt;/a&gt; is coming back to&amp;nbsp;Miami next week.&amp;nbsp; It arrives on October 12th-14th in&amp;nbsp;Miami, Florida&amp;nbsp;and there are still seats available.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The new &lt;a href="http://wildermuth.com/silverlight" target="_blank"&gt;&lt;strong&gt;Silverlight&lt;/strong&gt;&lt;/a&gt; 3 features&amp;nbsp;covered include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Out of the Browser Support&lt;/li&gt;
&lt;li&gt;Pixel Shaders &lt;/li&gt;
&lt;li&gt;Hardware Graphic Accelleration &lt;/li&gt;
&lt;li&gt;Behaviors &lt;/li&gt;
&lt;li&gt;Navigation Framework &lt;/li&gt;
&lt;li&gt;Blend 3 &lt;/li&gt;
&lt;li&gt;SketchFlow&lt;/li&gt;
&lt;li&gt;Binding Improvements &lt;/li&gt;
&lt;li&gt;Secure Web Services &lt;/li&gt;
&lt;li&gt;Binary XML Transport &lt;/li&gt;
&lt;li&gt;RIA Services Client Controls &lt;/li&gt;
&lt;li&gt;Text Rendering Improvements&lt;/li&gt;
&lt;li&gt;Render Caching&lt;/li&gt;
&lt;li&gt;And more...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://telerik.com"&gt;&lt;img style="float: right;" src="http://wildermuth.com/images/telerik.png" alt="Telerik" width="204" height="75" /&gt;&lt;/a&gt;In addition to the course, all attendess will also receive a free full-license to Telerik's RadControls for &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt;. RadControls are built on &lt;a href='http://microsoft.com' target='_blank'&gt;Microsoft&lt;/a&gt; &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; 3 and include 34 UI controls for building rich line-of-business &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; applications.&lt;/p&gt;
&lt;p&gt;&lt;img style="float: right;" src="http://wildermuth.com/images/slradcontrols.png" alt="RadControls" width="100" height="159" /&gt;To sign up for the class or hold a seat, visit the registration site:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://silverlight-tour.com/"&gt;&lt;strong&gt;http://silverlight-tour.com&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/09/30/Less_Than_Two_Weeks_Left_Before_Silverilght_Tour_in_Miami!'&gt;Add Comment&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f09%2f30%2fLess_Than_Two_Weeks_Left_Before_Silverilght_Tour_in_Miami!&amp;title=Less+Than+Two+Weeks+Left+Before+Silverilght+Tour+in+Miami!' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f09%2f30%2fLess_Than_Two_Weeks_Left_Before_Silverilght_Tour_in_Miami!" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/tD88LUAgdis" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/09/30/Less_Than_Two_Weeks_Left_Before_Silverilght_Tour_in_Miami!</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/09/30/Less_Than_Two_Weeks_Left_Before_Silverilght_Tour_in_Miami!</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/09/30/Less_Than_Two_Weeks_Left_Before_Silverilght_Tour_in_Miami!</guid>
      <pubDate>Wed, 30 Sep 2009 12:54:41 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2797</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2797</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments>
    </item>
    <item>
      <title>Choosing a Data Access Layer for Silverlight 3</title>
      <description>&lt;p&gt;&lt;a href="http://www.silverlight-tour.com"&gt;&lt;img style="float:right;" src="http://wildermuth.com/images/datadesign.png" alt="Silverlight" /&gt;&lt;/a&gt;&lt;span class="style1"&gt;&lt;a href="http://www.silverlight-tour.com"&gt;I&lt;/a&gt;f you're a regular reader of my blog, you'll probably remember my pithy blog post where I stated that "It all depends..." to the question "&lt;a href="http://wildermuth.com/2009/08/16/Which_Data_Access_Should_I_Use_for_Silverlight_3"&gt;Which Data Access Should I Use for Silverlight 3?&lt;/a&gt;"&amp;nbsp; The reality is that much like the similar question I am confronted with at user groups for the past decade ("What data access should I use in my .NET app?"). The reasons for picking a strategy are wide and varied so I will not try to analyze all possible outcomes, but I think the different strategies need to be explained better. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style1"&gt;The three major candidates in &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; 3 are Web Services (WCF/ASMX), &lt;a href='http://astoria.mslivelabs.com' target='_blank'&gt;ADO.NET Data Services&lt;/a&gt; and RIA Services.&amp;nbsp; In any situation, any of these will work. But they are suited to different styles and requirements. Here's the abridged differences between the stacks:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Web Services&lt;/strong&gt;: Interface-based Data Access&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href='http://astoria.mslivelabs.com' target='_blank'&gt;ADO.NET Data Services&lt;/a&gt;&lt;/strong&gt;: LINQ-based Data Access with change management&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RIA Services&lt;/strong&gt;: Interface-based Data Access with change management&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let's dive deeper into explaining these differences and why that might matter.&lt;/p&gt;
&lt;h2&gt;Web Services&lt;/h2&gt;
&lt;p&gt;Using web services is the tried and true method for communicating across the firewall. This pattern is well known and reliable. In general this requires you specify an interface for the CRUD operations as separate operations on a web service then dutifully call them in your &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; code.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Reasons to Use&lt;/strong&gt;&lt;/em&gt;: Any existing investment in web services can be a great reason to use them (whether in code or skillset). Also, web services are often used in cases where a project wants a very close control over the flow from the application to the database.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Reasons to Avoid&lt;/strong&gt;&lt;/em&gt;: With web services you end up having to keep track of the changes yourself and know what services to call with updates. Any need for batching or transactional support gets cumbersome and code-intensive.&lt;/p&gt;
&lt;h2&gt;&lt;a href='http://astoria.mslivelabs.com' target='_blank'&gt;ADO.NET Data Services&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href='http://astoria.mslivelabs.com' target='_blank'&gt;ADO.NET Data Services&lt;/a&gt; is a simple REST-based facility for data access. It relies on the HTTP stack to help define the interface. GET calls become Reads, POST becomes Updates and so on. It uses ATOM or JSON for its serialization format so it is consumable by a variety of clients.&lt;/p&gt;
&lt;p&gt;Underneath its covers it takes this URI based API and converts it into a &lt;a href='http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx' target='_blank'&gt;LINQ&lt;/a&gt; call for GETs and to API calls to the provider for inserts, updates and deletes. That means that &lt;a href='http://msdn.microsoft.com/data' target='_blank'&gt;ADO.NET&lt;/a&gt; is a thin layer who's purpose is to translate the URI model to data access code.&amp;nbsp; But its better than that...&lt;/p&gt;
&lt;p&gt;The real power of &lt;a href='http://astoria.mslivelabs.com' target='_blank'&gt;ADO.NET Data Services&lt;/a&gt; for &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; is the inclusion of the Client Library. This client library allows you to issue &lt;a href='http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx' target='_blank'&gt;LINQ&lt;/a&gt; queries defined in the client and executed on the server. While the &lt;a href='http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx' target='_blank'&gt;LINQ&lt;/a&gt; syntax is somewhat limited when compared to the server, it fulfills the 80% case and &lt;a href='http://astoria.mslivelabs.com' target='_blank'&gt;ADO.NET Data Services&lt;/a&gt; allows you to add operations to fill in the rest when necessary. In addition, the client library includes a powerful data context class that can monitor changes and issue changes in batches with transactional support.&lt;/p&gt;
&lt;p&gt;Exposing your data access with &lt;a href='http://astoria.mslivelabs.com' target='_blank'&gt;ADO.NET Data Services&lt;/a&gt; is about exposing queryable end-points instead of defining an interface. This is what makes is unique. For example, we can query our service using a &lt;a href='http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx' target='_blank'&gt;LINQ&lt;/a&gt; Query like so:&lt;/p&gt;
&lt;pre&gt;// &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; Code

// Create the query using LINQ
var qry = (&lt;strong&gt;from g in ds.Games&lt;/strong&gt;
           &lt;strong&gt;where g.Price &amp;lt; 50m&lt;/strong&gt;
           &lt;strong&gt;orderby g.Name&lt;/strong&gt;
           &lt;strong&gt;select g&lt;/strong&gt;) as DataServiceQuery&amp;lt;Game&amp;gt;;

// Execute the Query
// (This part is getting cleaner in &lt;a href='http://astoria.mslivelabs.com' target='_blank'&gt;ADO.NET Data Services&lt;/a&gt; v1.5) 
qry.BeginExecute(new AsyncCallback(r =&amp;gt;
  {
    games2.ItemsSource = qry.EndExecute(r).ToList();
    games2.DisplayMemberPath = "Name";
  }), null);
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Reasons to Use&lt;/strong&gt;: Want a simple, secure model where the developers can define the queries they need in code instead of changing the interface as the needs change.&amp;nbsp; The &lt;a href='http://msdn.microsoft.com/data' target='_blank'&gt;ADO.NET&lt;/a&gt; Data Services' client library makes the amount of code you write on the client small as it becomes &lt;a href='http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx' target='_blank'&gt;LINQ&lt;/a&gt; calls and working with the context class.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reasons to Avoid&lt;/strong&gt;: When you want tight control over the interface to your data access and do not want developers issuing &lt;a href='http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx' target='_blank'&gt;LINQ&lt;/a&gt; queries directly from the client code.&lt;/p&gt;
&lt;h2&gt;RIA Services&lt;/h2&gt;
&lt;p&gt;As the new kid on the block, RIA Services has a lot to offer. RIA Services is based on the idea of creating a data access API on the server and at the same time creating the client code in &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; (and other platforms in the future). Its focused on sharing code between the client and the server including validation logic.&amp;nbsp; In addition, while it allows you to create a set interface, it also provides a context object which can monitor changes on the client and batch those changes back to the server. In some ways RIA Services is like a hybrid of Web Services and &lt;a href='http://astoria.mslivelabs.com' target='_blank'&gt;ADO.NET Data Services&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Because RIA Services is based on a server-side query defined in its interface, on the client we call the query by calling the call on the interface:&lt;/p&gt;
&lt;pre&gt;// &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; Code

// The context object that tracks changes
XBoxGamesContext ctx = new XBoxGamesContext();

// Our RIA Query, really a call to an interface
var qry = &lt;strong&gt;ctx.GetGamesByGenreQuery("Shooter");

&lt;/strong&gt;// Bind the data
theList.ItemsSource = ctx.Load&amp;lt;Game&amp;gt;(qry).AllEntities;
&lt;/pre&gt;
&lt;p&gt;While in &lt;a href='http://astoria.mslivelabs.com' target='_blank'&gt;ADO.NET Data Services&lt;/a&gt; you are issuing &lt;a href='http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx' target='_blank'&gt;LINQ&lt;/a&gt; queries, RIA Services also allow you to add &lt;a href='http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx' target='_blank'&gt;LINQ&lt;/a&gt; constraints to the query endpoints.&amp;nbsp; For example instead of just creating a query by calling the interface, you can add &lt;a href='http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx' target='_blank'&gt;LINQ&lt;/a&gt; expressions to the endpoint like so:&lt;/p&gt;
&lt;pre&gt;var riaQry = ctx.GetGamesQuery()
                &lt;strong&gt;.Where(g =&amp;gt; g.Price &amp;lt; 50m)&lt;/strong&gt;
                &lt;strong&gt;.OrderBy(g =&amp;gt; g.Name);&lt;/strong&gt;

LoadOperation&amp;lt;Game&amp;gt; op = 
  ctx.Load&amp;lt;Game&amp;gt;(riaQry);
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Reasons to Use&lt;/strong&gt;: RIA Services is a good choice if you expect to develop a straightforward application minimum number of tiers. It works best in Rapid Application development scenarios versus large architected applications. RIA Services does support a mix between the interface based from Web Servics and and &lt;a href='http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx' target='_blank'&gt;LINQ&lt;/a&gt; based querying that is supported by &lt;a href='http://astoria.mslivelabs.com' target='_blank'&gt;ADO.NET Data Services&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reasons to Avoid&lt;/strong&gt;: RIA Services leverages a lot of magic code generation to make it work and that is harder to debug than it should be. Integration with large enterprises is possible, its not as easy it as it should be.&lt;/p&gt;
&lt;h2&gt;"So Which Would You Suggest?"&lt;/h2&gt;
&lt;p&gt;While I paint this picture of data access in &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; with a broad brush, I still get the question to suggest one over the other. The fact remains that there isn't a right/wrong answer here. A lot of it depends on the environment, project and skillset of the developers. So, no...I won't tell you what I suggest because I don't know the requirements and environment you work in. That's why they pay you the big bucks to be a developer, right?&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/09/29/Choosing_a_Data_Access_Layer_for_Silverlight_3'&gt;9 Comment(s)&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f09%2f29%2fChoosing_a_Data_Access_Layer_for_Silverlight_3&amp;title=Choosing+a+Data+Access+Layer+for+Silverlight+3' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f09%2f29%2fChoosing_a_Data_Access_Layer_for_Silverlight_3" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/PpSereTZiJE" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/09/29/Choosing_a_Data_Access_Layer_for_Silverlight_3</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/09/29/Choosing_a_Data_Access_Layer_for_Silverlight_3</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/09/29/Choosing_a_Data_Access_Layer_for_Silverlight_3</guid>
      <pubDate>Tue, 29 Sep 2009 00:07:56 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2796</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2796</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">9</slash:comments>
    </item>
    <item>
      <title>Niagara's Validation DSL - First Pass</title>
      <description>&lt;div nowrap&gt;&lt;strong&gt;URL&lt;/strong&gt;: &lt;a href='http://niagara.codeplex.com' target=_blank&gt;http://niagara.codeplex.com&lt;/a&gt;&lt;/div&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://niagara.codeplex.com"&gt;&lt;img style="float:right;" src="http://www.atlantic-cable.com/Cableships/Niagara/CM-Niagara_s.jpg" alt="Project Niagara" width="225" height="149" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;While Niagara is not going to require that you specify your validation attributes using its DSL, there are some benefits I think we can get by loosely coupling the validation. To that end, i've come up with a very first draft of the &lt;a href='http://en.wikipedia.org/wiki/Domain_Specific_Language' target='_blank'&gt;DSL&lt;/a&gt; to define the attributes.&amp;nbsp;I've decided that instead of being very English-like, to mimic the "M" style of language.&amp;nbsp; Here is my take:&lt;/p&gt;
&lt;pre&gt;// Niagara.Sample.Validation.validation
ValidationInfo
{
  Validators
  {
    // Some validators are built in
    // E.g. the System.ComponentModel.DataAnnotations
    MyCustomValidator = 
      "MyCustomValidator, Niagara.Example.Validators, Version 0.1"
  }
  
  Types("XBoxGames.Data, Version=1.0.0.0")
  {
    XBoxGames.Data.Game
    {
      Name { Required, StringLength(100) },
      Price { Range(0,2000) },
      Rating 
      {
        Required,
        MyCustomValidator("Adult", 1000)
      }
    },
    XBoxGames.Data.Genre
    {
      Name
      {
        Required,
        StringLength(100)
      }
    },
    XBoxGames.Data.Rating
    {
      Name
      {
        Required,
        StringLength(100)
      }
    }
  }
}&lt;/pre&gt;
&lt;p&gt;For any comments, please add them to the codeplex site here instead of commenting on the blog:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://niagara.codeplex.com/Thread/View.aspx?ThreadId=70371"&gt;http://niagara.codeplex.com/Thread/View.aspx?ThreadId=70371&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/09/28/Niagara_s_Validation_DSL_-_First_Pass'&gt;Add Comment&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f09%2f28%2fNiagara_s_Validation_DSL_-_First_Pass&amp;title=Niagara's+Validation+DSL+-+First+Pass' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f09%2f28%2fNiagara_s_Validation_DSL_-_First_Pass" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/vlUsJpdd8c4" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/09/28/Niagara_s_Validation_DSL_-_First_Pass</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/09/28/Niagara_s_Validation_DSL_-_First_Pass</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/09/28/Niagara_s_Validation_DSL_-_First_Pass</guid>
      <pubDate>Mon, 28 Sep 2009 15:23:36 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2795</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2795</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments>
    </item>
    <item>
      <title>Introducing Project Niagara</title>
      <description>&lt;div nowrap&gt;&lt;strong&gt;URL&lt;/strong&gt;: &lt;a href='http://niagara.codeplex.com' target=_blank&gt;http://niagara.codeplex.com&lt;/a&gt;&lt;/div&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://niagara.codeplex.com"&gt;&lt;img style="float: right;" src="http://www.atlantic-cable.com/Cableships/Niagara/CM-Niagara_s.jpg" alt="The Niagara" width="225" height="149" /&gt;&lt;/a&gt;The goal of &lt;a href="http://niagara.codeplex.com"&gt;Project Niagara&lt;/a&gt; is to democratize the validation support. The project wants to help developers add validation support to &lt;a href='http://astoria.mslivelabs.com' target='_blank'&gt;ADO.NET Data Services&lt;/a&gt; as well as Web Services in &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt;. In addition, it has the goal of allowing multiple ways to supply the validation metadata to the different data access strategies. As it is my opinion that there are scenarios where attributes are not the best idea.&lt;/p&gt;
&lt;p&gt;The deliverables for this project will include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ValidatingDataSvcUtil: Produce Validating Data Service Proxies.&lt;/li&gt;
&lt;li&gt;ValidatingProxy Library: Supply external metadata for generation of Proxies.&lt;/li&gt;
&lt;li&gt;MValidation: &lt;a href='http://en.wikipedia.org/wiki/Domain_Specific_Language' target='_blank'&gt;DSL&lt;/a&gt; for defining Validation outside of attributes.&lt;/li&gt;
&lt;li&gt;&lt;a href='http://msdn.microsoft.com/oslo' target='_blank'&gt;Oslo&lt;/a&gt; Integration: to store/retrieve validation out of the &lt;a href='http://msdn.microsoft.com/oslo' target='_blank'&gt;Oslo&lt;/a&gt; Repository.&lt;/li&gt;
&lt;li&gt;Alignment: RIA Services' and &lt;a href='http://msdn.microsoft.com/data' target='_blank'&gt;ADO.NET&lt;/a&gt; Data Services' Validation Logic &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At this point the project is very young (version 0.1) and a lot of the pieces are not ready but I am looking for help!&amp;nbsp; I can't write it all. Please visit the CodePlex site and take a look at what I want to accomplish and send me a message if you want to help out:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://niagara.codeplex.com"&gt;http://niagara.codeplex.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Current State of Niagara&lt;/h3&gt;
&lt;p&gt;Currently, I have built up some infrastructure to allow the whole project. This inlcudes a first pass at the &lt;a href='http://en.wikipedia.org/wiki/Domain_Specific_Language' target='_blank'&gt;DSL&lt;/a&gt;.&amp;nbsp; The one working pieces is the ValidatingDataServiceUtil which allows you to manually generate (via the command-line) an &lt;a href='http://msdn.microsoft.com/data' target='_blank'&gt;ADO.NET&lt;/a&gt; Data Service proxy that includes support for validation attributes and calling validation during two-way binding.&lt;/p&gt;
&lt;p&gt;The current version does not have a release yet, but if you're brave and willing to report bugs, you can get the source and build it yourself.&lt;/p&gt;
&lt;p&gt;To use the ValidatingDataServiceUtil, you can call it from the command-line:&lt;/p&gt;
&lt;pre&gt;NiagaraDataServiceUtil.exe http://localhost:14000/GameService.svc 
  ..\Niagara.Sample.Web\bin\Niagara.Sample.Web.dll 
  .\GameService.cs 
  Niagara.Sample.Data /v /b /c:V2
&lt;/pre&gt;
&lt;p&gt;While more complex than the original DataSvcUtil, the arguments are pretty straightforward:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;URI to the &lt;a href='http://msdn.microsoft.com/data' target='_blank'&gt;ADO.NET&lt;/a&gt; Data Service endpoint.&lt;/li&gt;
&lt;li&gt;Path to the assembly that holds the types and metadata (so we can read the metadata with reflection).&lt;/li&gt;
&lt;li&gt;The output file.&lt;/li&gt;
&lt;li&gt;The namespace to use.&lt;/li&gt;
&lt;li&gt;Options to specify what version of the data service library to use, bindability and validation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is an alternative to using a service reference. We hope to move this to be a project item instead of a command-line for the project.&lt;/p&gt;
&lt;p&gt;NOTE: It requires the &lt;a href='http://astoria.mslivelabs.com' target='_blank'&gt;ADO.NET Data Services&lt;/a&gt; CTP2 to work.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Let me know what you think!&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/09/28/Introducing_Project_Niagara'&gt;2 Comment(s)&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f09%2f28%2fIntroducing_Project_Niagara&amp;title=Introducing+Project+Niagara' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f09%2f28%2fIntroducing_Project_Niagara" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/wQ3wPbYarsk" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/09/28/Introducing_Project_Niagara</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/09/28/Introducing_Project_Niagara</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/09/28/Introducing_Project_Niagara</guid>
      <pubDate>Mon, 28 Sep 2009 01:59:01 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2794</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2794</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">2</slash:comments>
    </item>
    <item>
      <title>How Silverlight 3 Validation Works</title>
      <description>&lt;p&gt;&lt;a href="http://www.silverlight-tour.com"&gt;&lt;img style="float:right;" src="http://wildermuth.com/images/silverlightlogo100.jpg" alt="Silverlight" /&gt;&lt;/a&gt;As RIA Services is plodding towards a release, many people are looking at it to help them with validation of data in &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt;. Using this validation in &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; 3 is pretty straightforward but there are some caveats.&amp;nbsp; I want to show you under the covers so you understand what is happening. In this first part of the series, let's look at what it means to use validation from the outside.&lt;/p&gt;
&lt;h3&gt;How It Works&lt;/h3&gt;
&lt;p&gt;Back when Dynamic Data was being developed, a set of attributes was created to help tell the Dynamic Data folks about validation and other metadata so they could create smart scaffolds. These include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RequiredAttribute&lt;/li&gt;
&lt;li&gt;StringLengthAttribute&lt;/li&gt;
&lt;li&gt;RangeAttribute&lt;/li&gt;
&lt;li&gt;RegularExpressionAttribute&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In addition, there were attributes that could tell Dynamic Data about how to name fields and such. This meant that if you were using a POCO class or a DTO, that you could do the annotation like so:&lt;/p&gt;
&lt;pre&gt;public class GameInfo
{
  &lt;strong&gt;[Required]&lt;/strong&gt;
  &lt;strong&gt;[StringLength(100)]&lt;/strong&gt;
  public string Name { get; set; }

  &lt;strong&gt;[Range(0d, 1000d)]&lt;/strong&gt;
  public decimal Price { get; set; }
}
&lt;/pre&gt;
&lt;p&gt;When the GameInfo class is generated on the client, that's how the validaiton is happening.&amp;nbsp; On the client we can simply bind to the DataForm to show the validation in action:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://wildermuth.com/images/riavalidation_1.png" alt="RIA Validation" /&gt;&lt;/p&gt;
&lt;p&gt;While the DataForm will do this in a generic fashion (or even let you define templates), many &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; applications would like this validation behavior without using the DataForm. In fact, all the &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; 3 controls now support it but only if you know how to bind the elements correctly. If we bind the GameInfo to a StackPanel with some controls, we can get this same validation experience:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://wildermuth.com/images/riavalidation_2.png" alt="RIA Validation without DataForm" /&gt;&lt;/p&gt;
&lt;p&gt;This works in two ways.&amp;nbsp; First the controls themselves have support built-in for the validation part of the user control.&amp;nbsp; When you skin a TextBox or other control, part of the ControlTemplate is the validation UI. So you can change what that looks like. The controls themselves react to the validation errors because of the way they are bound. For example, this simple UI looks like this in XAML:&lt;/p&gt;
&lt;pre&gt;&amp;lt;TextBlock&amp;gt;Name&amp;lt;/TextBlock&amp;gt;
&amp;lt;TextBox Text="{Binding Name, &lt;strong&gt;Mode=TwoWay&lt;/strong&gt;, 
                              &lt;strong&gt;NotifyOnValidationError=true&lt;/strong&gt;, 
                              &lt;strong&gt;ValidatesOnExceptions=true&lt;/strong&gt;}" /&amp;gt;
&amp;lt;TextBlock&amp;gt;Price&amp;lt;/TextBlock&amp;gt;
&amp;lt;TextBox Text="{Binding Price, &lt;strong&gt;Mode=TwoWay&lt;/strong&gt;, 
                               &lt;strong&gt;NotifyOnValidationError=true&lt;/strong&gt;, 
                               &lt;strong&gt;ValidatesOnExceptions=true&lt;/strong&gt;}" /&amp;gt;
&lt;/pre&gt;
&lt;p&gt;These three parts of the binding are critical to making this work. The validation is performed when the data is pushed back into the backing data but how does this actually work? The hint is in the "ValidatesOnExceptions".&lt;/p&gt;
&lt;p&gt;With a TwoWay binding, when you lose focus on a control, the value is pushed back to the control (including going through any converters you have specified). Normally if an exception is thrown during that process it fails to update the underlying object, but just swallows that error. But if you enable it with these two binding markup extensions, it assumes that any exception thrown during the TwoWay operation is a Validation error. Back in &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; 2, you could do this by simply adding validation logic directly in your data classes like so:&lt;/p&gt;
&lt;pre&gt;public string Name
{
  get
  {
    return this._name;
  }
  set
  {
    if ((this._name != value))
    {
      if (value.Length &amp;gt; 100)
      {
        throw new ValidationException(
          "String cannot be longer than 100 characters");
      }

      this._name = value;
    }
  }
}
&lt;/pre&gt;
&lt;p&gt;This is where the Validaiton attributes we mentioned earlier come in. The controls themselves do not make the check for the validation. Instead there are two classes that come into picture. &lt;strong&gt;ValidationContext&lt;/strong&gt; and &lt;strong&gt;Validator&lt;/strong&gt;. These classes can be used to test a property's or an entire object's set of validation attributes. Essentially, the ValidationContext sets up what needs to be validated and the Validator performs the validation like so:&lt;/p&gt;
&lt;pre&gt;public string Name
{
  get
  {
    return this._name;
  }
  set
  {
    if ((this._name != value))
    {
      &lt;strong&gt;var ctx = new ValidationContext(this, null, null);&lt;/strong&gt;
      &lt;strong&gt;ctx.MemberName = "Name";&lt;/strong&gt;

      &lt;strong&gt;// If fails, throws an excption&lt;/strong&gt;
      &lt;strong&gt;Validator.ValidateProperty(value, ctx);&lt;/strong&gt;

      this._name = value;
    }
  }
}
&lt;/pre&gt;
&lt;p&gt;These classes working together validates the value against whatever ValidationAttributes are on the "Name" property (e.g. Required, StringLength) and throws a ValidationException when it fails.&amp;nbsp; In fact, lets look look at the RIA Services class it generates in Silverlight:&lt;/p&gt;
&lt;pre&gt;[DataMember()]
[Required()]
[StringLength(100)]
public string Name
{
  get
  {
    return this._name;
  }
  set
  {
    if ((this._name != value))
    {
      this.&lt;strong&gt;ValidateProperty("Name", value);&lt;/strong&gt;
      this.OnNameChanging(value);
      this.RaiseDataMemberChanging("Name");
      this._name = value;
      this.RaiseDataMemberChanged("Name");
      this.OnNameChanged();
    }
  }
}
&lt;/pre&gt;
&lt;p&gt;In fact, the first thing that the generated class does is call a base class method called ValidateProperty which does the same thing as our previous example. Understanding how this really works is key to debugging odd scenarios (like a validation exception showing up for a conversion failure).&lt;/p&gt;
&lt;h3&gt;Trouble with the Code Generation&lt;/h3&gt;
&lt;p&gt;Most of us are not using POCO classes (yet) for our data containers, but are using &lt;a href='http://en.wikipedia.org/wiki/Object-relational_mapping' target='_blank'&gt;ORM&lt;/a&gt;'s to build our data layers for us. This was a problem for the Dynamic Data folks back a while and came up with the idea of Metadata Types. A metadata type is simply a way of specifying a candiate class. In fact RIA services does this for you (if you ask it nicely) but you can specify these yourself. The key is the &lt;strong&gt;MetadataType&lt;/strong&gt; attribute which is useful to do in the partial class. For example for an &lt;a href='http://msdn2.microsoft.com/en-us/library/aa697427(VS.80).aspx' target='_blank'&gt;Entity Framework&lt;/a&gt; type:&lt;/p&gt;
&lt;pre&gt;&lt;strong&gt;[MetadataType(typeof(Game.GameMetadata))]&lt;/strong&gt;
public partial class Game
{
  internal sealed class GameMetadata
  {
    // Metadata classes are not meant to be instantiated.
    private GameMetadata()
    {
    }

    public string Description;

    public string Developer;

    public EntityState EntityState;

    public int GameID;

    public Genre TheGenre;

    public string ImageUrl;

    [Required]
    [StringLength(100)]
    public string Name;

    [Range(0d, 2000d)]
    public Nullable Price;

    public string Publisher;

    public Rating TheRating;

    public Nullable&amp;lt;DateTime&amp;gt; ReleaseDate;
  }
}
&lt;/pre&gt;
&lt;p&gt;This class is a place that the validation or dynamic data runtimes can look for the attributes. Note, that this example uses a nested type but it could be a completely separate type as well.&lt;/p&gt;
&lt;p&gt;NOTE: This works with RIA Services great. But its a hack. To pretend its anything but a hack is deluding yourself. My opinion is that this sort of information that is view specific should probably be loosely coupled instead of tightly in the form of attributes. If we did this on POCO classes, we'd be forced to have the validation attributes exist as a reference in every place we need them.&lt;/p&gt;
&lt;h3&gt;Just RIA Services?&lt;/h3&gt;
&lt;p&gt;There are many organizations out there that aren't using RIA Services for their data access (and i'll blog soon about why RIA Services is just a solution, not *the* solution data access). But if you are already using &lt;a href='http://astoria.mslivelabs.com' target='_blank'&gt;ADO.NET Data Services&lt;/a&gt; or Web Services, hooking into the validation logic is difficult. Adding the attributes is difficult in &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; since the generated code doesn't have any place to hook up the attributes (and MetadataType isn't supported in &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt;). In addition, the attributes are only part of the problem as you'd need to build in the ability to do the validation on the set/gets (which is possible with &lt;a href='http://astoria.mslivelabs.com' target='_blank'&gt;ADO.NET Data Services&lt;/a&gt; but impossible with today's Web Service proxies). So today, this is most easily accomplished using RIA services.&amp;nbsp; But I don't believe that in the best interest of developers.&lt;/p&gt;
&lt;p&gt;If you've followed this blog, you know that I love the idea of choice (e.g. my &lt;a href='http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx' target='_blank'&gt;LINQ&lt;/a&gt; to Hibernate &lt;a href='http://msdn.microsoft.com/data' target='_blank'&gt;ADO.NET&lt;/a&gt; Data Example). So I want to be able to leverage the Validation logic no matter what what data access you're using. I have started a new project called Niagara that I hope will address some of these issues.&amp;nbsp; See my blog post about it here:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://wildermuth.com/2009/09/28/Introducing_Project_Niagara"&gt;http://wildermuth.com/2009/09/28/Introducing_Project_Niagara&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/09/28/How_Silverlight_3_Validation_Works'&gt;4 Comment(s)&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f09%2f28%2fHow_Silverlight_3_Validation_Works&amp;title=How+Silverlight+3+Validation+Works' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f09%2f28%2fHow_Silverlight_3_Validation_Works" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/SOuBEJHIN-8" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/09/28/How_Silverlight_3_Validation_Works</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/09/28/How_Silverlight_3_Validation_Works</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/09/28/How_Silverlight_3_Validation_Works</guid>
      <pubDate>Mon, 28 Sep 2009 01:57:44 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2793</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2793</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">4</slash:comments>
    </item>
    <item>
      <title>Fall/Winter Silverlight Tour Schedule</title>
      <description>&lt;div nowrap&gt;&lt;strong&gt;URL&lt;/strong&gt;: &lt;a href='https://agilitrain.com/workshop/info/Silverlight_Tour_Workshop' target=_blank&gt;https://agilitrain.com/workshop/info/Silverligh...&lt;/a&gt;&lt;/div&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://www.silverlight-tour.com"&gt;&lt;img style="float:right;" src="http://wildermuth.com/images/stlogo.png" alt="Silverlight Tour" /&gt;&lt;/a&gt;We have made some adjustments in the Fall/Winter schedule for the &lt;a href='http://www.silverlight-tour.com' target='_blank'&gt;Silverlight Tour&lt;/a&gt;. As Fall is often our busiest time of year, we decided to move some dates around to not conflict with the PDC and other conferences. Here is the new Schedule for the &lt;a href='http://www.silverlight-tour.com' target='_blank'&gt;Silverlight Tour&lt;/a&gt; and the Advanced &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; Workshop:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://agilitrain.com/Workshop/Info/Silverlight_Tour_Workshop"&gt;&lt;strong&gt;Silverlight Tour&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table style="font-size:18px;" border="0" cellspacing="2" cellpadding="2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Oct 12-14, 2009&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://agilitrain.com/Workshop/Info/Silverlight_Tour_Workshop"&gt;Miami, FL&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dec 2-4, 2009&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://agilitrain.com/Workshop/Info/Silverlight_Tour_Workshop"&gt;Portland, OR&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dec 7-9, 2009&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://agilitrain.com/Workshop/Info/Silverlight_Tour_Workshop"&gt;Atlanta, GA&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jan 4-6, 2010&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://agilitrain.com/Workshop/Info/Silverlight_Tour_Workshop"&gt;San Francisco, CA &lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://agilitrain.com/Workshop/Info/Advanced_Silverlight"&gt;&lt;strong&gt;Advanced Silverlight Workshop&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table style="font-size:18px;" border="0" cellspacing="2" cellpadding="2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Nov 30-Dec 1, 2009&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://agilitrain.com/Workshop/Info/Advanced_Silverlight"&gt;Atlanta, GA&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mar 22-23, 2010&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://agilitrain.com/Workshop/Info/Advanced_Silverlight"&gt;Atlanta, GA&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Note that by attending the &lt;a href='http://www.silverlight-tour.com' target='_blank'&gt;Silverlight Tour&lt;/a&gt; workshop, you not only receive a full version of Telerik's RadControls for &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; but also get a discount to attend the Advanced &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; Workshop.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/09/20/Fall_Winter_Silverlight_Tour_Schedule'&gt;Add Comment&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f09%2f20%2fFall_Winter_Silverlight_Tour_Schedule&amp;title=Fall%2fWinter+Silverlight+Tour+Schedule' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f09%2f20%2fFall_Winter_Silverlight_Tour_Schedule" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/xnIhQ46BcEw" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/09/20/Fall_Winter_Silverlight_Tour_Schedule</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/09/20/Fall_Winter_Silverlight_Tour_Schedule</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/09/20/Fall_Winter_Silverlight_Tour_Schedule</guid>
      <pubDate>Sun, 20 Sep 2009 23:07:09 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2792</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2792</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments>
    </item>
    <item>
      <title>Using Large Message Requests in Silverlight with WCF</title>
      <description>&lt;p&gt;&lt;a href="http://www.silverlight-tour.com"&gt;&lt;img style="float:right;" src="http://wildermuth.com/images/silverlightlogo100.jpg" alt="Silverlight" /&gt;&lt;/a&gt;Today I was working with a client and ran into a problem I didn't expect. This particular problem had to do with &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; consuming a WCF Service. Sometimes WCF causes me to spew four letter words. There is a class of WCF problems that cause this: connection rejection. WCF has been designed to prevent common DDoS and other attacks that could cause servers to fail or at least not serve honest requests. To this end the default size of a request is quite small. In fact, its usually 64K in size. This size is fine for most every request but occassionally when a client wants to send a collection of things to the server this size is too small. But we'll get to that in a minute. First, some background...&lt;/p&gt;
&lt;p&gt;This particular client has a large service that's been working for quite a while, then suddenly a single call he has was being rejected. The new service call he was making was sending back a list of a couple of hundred of POCO classes. He had been downloading large lists before so on the surface this should have worked. But it didn't.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The cause was that the default WCF limits were rejecting the connection. This type of error where its just failing, even Fiddler isn't helpful. There is no return code, the connection is just severed. Debugging it requires some trial and error which sucks.&amp;nbsp; The calls that were returning a lot of data were working fine because the default ClientConfig file looks like this:&lt;/p&gt;
&lt;pre&gt;&amp;lt;configuration&amp;gt;
  &amp;lt;system.serviceModel&amp;gt;
    &amp;lt;bindings&amp;gt;
      &amp;lt;customBinding&amp;gt;
        &amp;lt;binding name="CustomBinding_MyService"&amp;gt;
          &amp;lt;binaryMessageEncoding /&amp;gt;
          &amp;lt;httpTransport &lt;strong&gt;maxReceivedMessageSize="2147483647"
                       maxBufferSize="2147483647"&amp;gt;&lt;/strong&gt;
            &amp;lt;extendedProtectionPolicy policyEnforcement="Never" /&amp;gt;
          &amp;lt;/httpTransport&amp;gt;
        &amp;lt;/binding&amp;gt;
      &amp;lt;/customBinding&amp;gt;
    &amp;lt;/bindings&amp;gt;
    &amp;lt;client&amp;gt;
      &amp;lt;endpoint address="http://127.0.0.1.:8000/MyService.svc"
                binding="customBinding"
                bindingConfiguration="CustomBinding_MyService"
                contract="MyServices.MyService"
                name="CustomBinding_MyService" /&amp;gt;
    &amp;lt;/client&amp;gt;
  &amp;lt;/system.serviceModel&amp;gt;
&amp;lt;/configuration&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The &lt;strong&gt;maxReceivedMessageSize&lt;/strong&gt; and &lt;strong&gt;maxBufferSize&lt;/strong&gt; both accept these large responses from the server. But the reverse isn't true. The server's defaults are about 64K. Since we got it working, I wanted to show what we did so maybe others could use these server settings to address it.&lt;/p&gt;
&lt;p&gt;The trick is to change the customBinding in the web.config to use larger defaults. I picked 2MB as it its a reasonable size. Of course setting them to 2GB like shown above will work but it does leave you more vulnerable to attacks.&amp;nbsp; Pick a size that isn't larger than your largest request but isn't overly large. Its a guessing game.&amp;nbsp; To set these, you need to add them to your web.config is to put them on the httpTransport node:&lt;/p&gt;
&lt;pre&gt;&amp;lt;system.serviceModel&amp;gt;
  &amp;lt;behaviors&amp;gt;
    &amp;lt;serviceBehaviors&amp;gt;
      &amp;lt;behavior name="TestLargeWCF.Web.MyServiceBehavior"&amp;gt;
        &amp;lt;serviceMetadata httpGetEnabled="true"/&amp;gt;
        &amp;lt;serviceDebug includeExceptionDetailInFaults="false"/&amp;gt;
      &amp;lt;/behavior&amp;gt;
    &amp;lt;/serviceBehaviors&amp;gt;
  &amp;lt;/behaviors&amp;gt;
  &amp;lt;bindings&amp;gt;
    &amp;lt;customBinding&amp;gt;
      &amp;lt;binding name="customBinding0"&amp;gt;
        &amp;lt;binaryMessageEncoding /&amp;gt;
        &amp;lt;httpTransport &lt;strong&gt;maxReceivedMessageSize="2097152"
                     maxBufferSize="2097152" 
                     maxBufferPoolSize="2097152" &lt;/strong&gt;/&amp;gt;
      &amp;lt;/binding&amp;gt;
    &amp;lt;/customBinding&amp;gt;
  &amp;lt;/bindings&amp;gt;
  &amp;lt;serviceHostingEnvironment aspNetCompatibilityEnabled="true"/&amp;gt;
  &amp;lt;services&amp;gt;
    &amp;lt;service behaviorConfiguration="Web.MyServiceBehavior"
             name="TestLargeWCF.Web.MyService"&amp;gt;
      &amp;lt;endpoint address=""
                binding="customBinding"
                bindingConfiguration="customBinding0"
                contract="TestLargeWCF.Web.MyService"/&amp;gt;
      &amp;lt;endpoint address="mex"
                binding="mexHttpBinding"
                contract="IMetadataExchange"/&amp;gt;
    &amp;lt;/service&amp;gt;
  &amp;lt;/services&amp;gt;
&amp;lt;/system.serviceModel&amp;gt;&lt;/pre&gt;
&lt;p&gt;That's the trick. Hope it helps you not waste your day like I wasted mine ;)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/09/10/Using_Large_Message_Requests_in_Silverlight_with_WCF'&gt;4 Comment(s)&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f09%2f10%2fUsing_Large_Message_Requests_in_Silverlight_with_WCF&amp;title=Using+Large+Message+Requests+in+Silverlight+with+WCF' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f09%2f10%2fUsing_Large_Message_Requests_in_Silverlight_with_WCF" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/fyXvuBaH1XQ" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/09/10/Using_Large_Message_Requests_in_Silverlight_with_WCF</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/09/10/Using_Large_Message_Requests_in_Silverlight_with_WCF</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/09/10/Using_Large_Message_Requests_in_Silverlight_with_WCF</guid>
      <pubDate>Thu, 10 Sep 2009 21:17:11 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2791</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2791</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">4</slash:comments>
    </item>
    <item>
      <title>ADO.NET Data Services 1.5 Feature: Projections</title>
      <description>&lt;p&gt;&lt;a href="http://www.silverlight-tour.com"&gt;&lt;img style="float:right;" src="http://wildermuth.com/images/adodataservices.jpg" alt="Silverlight" /&gt;&lt;/a&gt;&lt;span class="style1"&gt;&lt;a href="http://www.silverlight-tour.com"&gt;I&lt;/a&gt;f you've been following my blog, you should know that I am keeping a pretty close watch on &lt;a href='http://astoria.mslivelabs.com' target='_blank'&gt;ADO.NET Data Services&lt;/a&gt;. The team recently released a second CTP of the new version with some interesting features. This CTP has some pretty compelling additions, but I am going ot focus on one in particular. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I've been teaching and using &lt;a href='http://astoria.mslivelabs.com' target='_blank'&gt;ADO.NET Data Services&lt;/a&gt; for a long time and I like showing off exposing a LINQ-based provider (Entity Framework, &lt;a href='http://www.hibernate.org/343.html' target='_blank'&gt;NHibernate&lt;/a&gt; or others) to a &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; application. While &lt;a href='http://astoria.mslivelabs.com' target='_blank'&gt;ADO.NET Data Services&lt;/a&gt; does expose its API through a REST API, the magic for me is in its use in &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt;. In case you haven't been following along, using the &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; client you can issue a &lt;a href='http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx' target='_blank'&gt;LINQ&lt;/a&gt; query through the &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; client (though in fairness, the full power of &lt;a href='http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx' target='_blank'&gt;LINQ&lt;/a&gt; is not supported in the client):&lt;/p&gt;
&lt;pre&gt;var qry = (from g in ctx.Games
           where g.Genre.Name == "Shooter"
           orderby g.ReleaseDate
           select g) as DataServiceQuery&amp;lt;Game&amp;gt;;

qry.BeginExecute(new AsyncCallback(r =&amp;gt;
{
  try
  {
    theList.ItemsSource = qry.EndExecute(r).ToList();
  }
  catch (Exception ex)
  {
    // NOOP
  }
}), null);&lt;/pre&gt;
&lt;p&gt;This is a powerful feature so that (unlike web services) developers can use a looser service definition to define their data stack. Let the developer who needs data be able to sort, filter and shape that data as necessary.&lt;/p&gt;
&lt;p&gt;The last part of that phrase is "shape" on purpose. When I first teach this technology, I am often asked "what sort of shaping do you mean?" In &lt;a href='http://astoria.mslivelabs.com' target='_blank'&gt;ADO.NET Data Services&lt;/a&gt; 1.0, you could shape it by returning a hierarchy of data using the Expand method in the &lt;a href='http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx' target='_blank'&gt;LINQ&lt;/a&gt; query. For example, we can return the game data with the Genre entity attached to every game like so:&lt;/p&gt;
&lt;pre&gt;var qry = (from g in ctx.Games
                      &lt;strong&gt;  .Expand("Genre")&lt;/strong&gt;
           where g.Genre.Name == "Shooter"
           orderby g.ReleaseDate
           select g) as DataServiceQuery&amp;lt;Game&amp;gt;;

qry.BeginExecute(new AsyncCallback(r =&amp;gt;
{
  try
  {
    theList.ItemsSource = qry.EndExecute(r).ToList();
  }
  catch (Exception ex)
  {
    // NOOP
  }
}), null);&lt;/pre&gt;
&lt;p&gt;But this level of shaping is powerful but limited in scope. This is where &lt;a href='http://astoria.mslivelabs.com' target='_blank'&gt;ADO.NET Data Services&lt;/a&gt; 1.5 comes up trumps. In this new CTP we can now do projections to retrieve specific data. For example:&lt;/p&gt;
&lt;pre&gt;var qry = (from g in ctx.Games
           where g.Genre.Name == "Shooter"
           orderby g.ReleaseDate
           &lt;strong&gt;select new
           {
             Name = g.Name,
             ReleaseDate = g.ReleaseDate.GetValueOrDefault(),
           }) as DataServiceQuery;&lt;/strong&gt;&lt;/pre&gt;
&lt;p&gt;This query creates a new anonymous type that has the two values we want instead of returning the entire entity. In any other .NET project this would be fine, but for &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; we can't use the anonymous type for data binding (for security reasons). So like other anonymous type uses in Silverlight, you must project them into a known type.&amp;nbsp; A type like that is pretty easy to cruft up if you need:&lt;/p&gt;
&lt;pre&gt;var qry = (from g in ctx.Games
           where g.Genre.Name == "Shooter"
           orderby g.ReleaseDate
           select &lt;strong&gt;new GameInfo()&lt;/strong&gt;
           {
             Name = g.Name,
             ReleaseDate = g.ReleaseDate.GetValueOrDefault()
           }) as DataServiceQuery&amp;lt;&lt;strong&gt;GameInfo&lt;/strong&gt;&amp;gt;;
&lt;/pre&gt;
&lt;p&gt;This is useful to no only limit the fields you return but also to shape the result.&amp;nbsp; For example we can use the projection to retrieve the name, release date and the genre's name (normally a related object) like so:&lt;/p&gt;
&lt;pre&gt;var qry = (from g in ctx.Games
           where g.Genre.Name == "Shooter"
           orderby g.ReleaseDate
           select new GameInfo()
           {
             Name = g.Name,
             ReleaseDate = g.ReleaseDate.GetValueOrDefault(),
             &lt;strong&gt;GenreName = g.Genre.Name
&lt;/strong&gt;           }) as DataServiceQuery&amp;lt;&lt;strong&gt;GameInfo&lt;/strong&gt;&amp;gt;;
&lt;/pre&gt;
&lt;p&gt;This is all well and good, but what about saving these projections? For the most part you should treat complex projections (like the one above) as read-only. But if you retrieve entities that are purely subsets of existing entities, then &lt;a href='http://astoria.mslivelabs.com' target='_blank'&gt;ADO.NET Data Services&lt;/a&gt; will handle it.&amp;nbsp; Though currently this is crashing in &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; (it is a CTP after all). I will update this if I find a way around the saving bug in the near future and post the demo at that time.&lt;/p&gt;
&lt;p&gt;But in general this is an awesome new addition to the library that I hope will close some of the use-cases that forced me to write Service Operations in the past.&lt;/p&gt;
&lt;p&gt;What do you think?&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/09/09/ADO_NET_Data_Services_1_5_Feature_Projections'&gt;12 Comment(s)&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f09%2f09%2fADO_NET_Data_Services_1_5_Feature_Projections&amp;title=ADO.NET+Data+Services+1.5+Feature%3a+Projections' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f09%2f09%2fADO_NET_Data_Services_1_5_Feature_Projections" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/k4oLF14_F38" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/09/09/ADO_NET_Data_Services_1_5_Feature_Projections</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/09/09/ADO_NET_Data_Services_1_5_Feature_Projections</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/09/09/ADO_NET_Data_Services_1_5_Feature_Projections</guid>
      <pubDate>Wed, 09 Sep 2009 22:34:36 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2790</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2790</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">12</slash:comments>
    </item>
    <item>
      <title>Silverlight Data Examples Have Been Updated!</title>
      <description>&lt;div nowrap&gt;&lt;strong&gt;URL&lt;/strong&gt;: &lt;a href='http://www.silverlightdata.com' target=_blank&gt;http://www.silverlightdata.com&lt;/a&gt;&lt;/div&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://www.silverlight-tour.com"&gt;&lt;img style="float:right;" src="http://wildermuth.com/images/silverlightlogo100.jpg" alt="Silverlight Logo" /&gt;&lt;/a&gt;If you've never had the chance to visit my sister site (&lt;a href="http://www.silverlightdata.com"&gt;http://www.silverlightdata.com&lt;/a&gt;), now's a good time. I've updated my examples there to include my MVVM, Prism and Declarative UI examples (to go with the skinning/switchable &lt;a href='http://astoria.mslivelabs.com' target='_blank'&gt;Astoria&lt;/a&gt; example).&amp;nbsp; Take a look if you're doing &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; data-based applications.&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/09/02/Silverlight_Data_Examples_Have_Been_Updated!'&gt;Add Comment&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f09%2f02%2fSilverlight_Data_Examples_Have_Been_Updated!&amp;title=Silverlight+Data+Examples+Have+Been+Updated!' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f09%2f02%2fSilverlight_Data_Examples_Have_Been_Updated!" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/BJCDPgujiJQ" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/09/02/Silverlight_Data_Examples_Have_Been_Updated!</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/09/02/Silverlight_Data_Examples_Have_Been_Updated!</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/09/02/Silverlight_Data_Examples_Have_Been_Updated!</guid>
      <pubDate>Wed, 02 Sep 2009 16:44:25 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2789</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2789</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments>
    </item>
    <item>
      <title>Why Declarative UIs Are Important</title>
      <description>&lt;div nowrap&gt;&lt;strong&gt;URL&lt;/strong&gt;: &lt;a href='http://wildermuth.com/downloads/declarativeui.zip' target=_blank&gt;http://wildermuth.com/downloads/declarativeui.zip&lt;/a&gt;&lt;/div&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://www.silverlight-tour.com"&gt;&lt;img style="float:right;" src="http://wildermuth.com/images/sketch.png" alt="Sketching a UI" width="150" height="153" /&gt;&lt;/a&gt;If you're building Internet applications, you've probably been bombarded with lots of new technologies the last few years: Silverlight, Flex, &lt;a href='http://asp.net' target='_blank'&gt;ASP.NET&lt;/a&gt; MVC, jQuery, etc. While all of these technologies have their use-cases, many of them are pointing to something that is new and important.&lt;/p&gt;
&lt;p&gt;The central idea of separating concerns is not new. Back in SmallTalk when Model-View-Controller was born, the benefits of isolating layers of an application were pretty apparent. The problem was that it wasn't easy to implement. The problem with implementation was never the code...or was exactly the code. The problem is that when you are working on a problem in the user interface, it is far to easy to try and solve it directly in the code. Its not laziness or lack of talent.&amp;nbsp; Its simply a matter of focus sometimes. Under the timeline gun its easy to be myopic about a problem. Its simply too easy to just try and solve a problem by writing code in the user interface (or the View).&lt;/p&gt;
&lt;p&gt;This is why I think that Declarative User Interfaces are so important. But what are Declarative User Interfaces?&amp;nbsp;Simply put, Declarative User Interfaces (or Declarative UIs) are defining views using markup to deliver content and behavior. The two most obvious examples in the &lt;a href='http://microsoft.com' target='_blank'&gt;Microsoft&lt;/a&gt; space are &lt;a href='http://msdn2.microsoft.com/en-us/library/ms752059.aspx' target='_blank'&gt;XAML&lt;/a&gt; and MVC Views. What makes Declarative UI's so seductive is that fact that putting non-UI code (or business logic) in the markup is not only difficult but tends to feel wrong. That sort of code sticks out like a thumb. In my opinion, it encourages the behavior of keeping the View as purely user interface code. Let's use &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; as an example of building using a Declarative UI.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;An Example&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I started by staying completely in Blend to do my design. My basic, but simple idea, was an editor for XBox games (yeah, I know) that could select by Genre the games to view. Here's my original concept:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://wildermuth.com/images/decui_1.jpg" alt="Blend Concept #1" /&gt;&lt;/p&gt;
&lt;p&gt;Now that idea is fine, but I needed some data to clarify my ideas so I used the Blend Sample Data feature to create some dummy data. At this point all I am doing is proving my design, but at the same time I am getting a data shape that development (me in this case, but possibly different people) will use later as the data I want to edit.&amp;nbsp; By defining this shape, I am allowing myself to do the data binding. My Sample Data in Blend looks something like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://wildermuth.com/images/decui_2.jpg" alt="Blend Sample Data" /&gt;&lt;/p&gt;
&lt;p&gt;Once data bound, my initial user interface looks like so:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://wildermuth.com/images/decui_3.jpg" alt="Data Bound in Blend" /&gt;&lt;/p&gt;
&lt;p&gt;Normally, this would be the time that the user interface would initially be handed over to development. Since I wrote everything, I moved on to &lt;a href='http://msdn2.microsoft.com/en-us/vstudio/default.aspx' target='_blank'&gt;Visual Studio&lt;/a&gt;. The benefit of doing this much work in Blend first is that all I need to do is handle creating the data and replace the sample data with my own data and we can move on.&lt;/p&gt;
&lt;p&gt;Once in Visual Studio, you should notice that the sample data is now part of your project.&amp;nbsp; The Sample data is included in the App.XAML file like so:&lt;/p&gt;
&lt;pre&gt;&amp;lt;Application xmlns="..."
             xmlns:x="..."
             xmlns:SampleData="..."
             xmlns:d="..."
             xmlns:mc="..."
             x:Class="DeclarativeUI.App"
             mc:Ignorable="d"&amp;gt;
  &amp;lt;Application.Resources&amp;gt;
    &amp;lt;!-- Resources scoped at the Application 
         level should be defined here. --&amp;gt;
   &lt;strong&gt; &amp;lt;SampleData:GamesData x:Key="GamesData"
                          d:IsDataSource="True" /&amp;gt;&lt;/strong&gt;
  &amp;lt;/Application.Resources&amp;gt;
&amp;lt;/Application&amp;gt;
&lt;/pre&gt;
&lt;p&gt;This data is used in the main view simply as its DataContext (because that's how I bound the sample data in Blend):&lt;/p&gt;
&lt;pre&gt;&amp;lt;UserControl xmlns="..."
             xmlns:x="..."
             x:Class="DeclarativeUI.MainPage"
             DataContext="&lt;strong&gt;{Binding Source={StaticResource GamesData}}&lt;/strong&gt;"&amp;gt;&lt;/pre&gt;
&lt;p&gt;Now that I am in Visual Studio, I can start replacing the Sample Data. I built a Model and a ViewModel (see my MSDN Magazine article &lt;a href="http://msdn.microsoft.com/en-us/magazine/dd458800.aspx"&gt;here&lt;/a&gt; for more information on MVVM in &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt;). The ViewModel simply exposed the same sort of data that the sample data does (though I am returning a fuller Game and Genre object since there is more data in the database):&lt;/p&gt;
&lt;pre&gt;public interface IMainViewModel : IViewModel
{
  ObservableCollection&amp;lt;Genre&amp;gt; Genres { get; }
  ObservableCollection&amp;lt;Game&amp;gt; Games { get; }

  void GetGenresAsync();
  void GetGamesByGenreAsync(object sender, EventArgs args);
  void SaveAllAsync();
}&lt;/pre&gt;
&lt;p&gt;The ViewModel looks like the Sample Data so simply setting the DataContext with my ViewModel should work at showing the sample data. But we're only partly there. Note that the ViewModel interface exposes both the Genres and Games collections that we defined in the sample data, but also exposes the methods that performs the data access verbs. This is where Declarative UIs can be really powerful.&lt;/p&gt;
&lt;p&gt;In &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; 3, the Blend team introduced Behaviors to simplify actions and triggers in &lt;a href='http://msdn2.microsoft.com/en-us/library/ms752059.aspx' target='_blank'&gt;XAML&lt;/a&gt;. For the WPF-aware readers, Behaviors are different in that they are pre-packaged bundles of functionality. While most behaviors are tied to performing actions on the user interface directly (e.g. ControlStoryboardAction) they are not technologically limited in that way. In my early experiments with Behaviors, I had created a simple behavior to call into a ViewModel. Because Behaviors can work with data binding, it becomes an easy way to interact with the ViewModel (without having a hard connection to it). They allow our UI's to be declarative but still separating those concerns.&lt;/p&gt;
&lt;p&gt;My Behavior had a lot of problems with it and I had been looking for time to revisit it when I ran into the Blend team's new sample behaviors:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://expressionblend.codeplex.com"&gt;http://expressionblend.codeplex.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This project adds a number of behaviors to Blend including several specifically for data-driven applications. While all the data-driven behaviors are interesting, i'll focus on one for our problem: &lt;strong&gt;CallDataMethod&lt;/strong&gt;. This behavior allows you to call a method on an object (usually the &lt;strong&gt;DataContext&lt;/strong&gt;) when an event fires.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;In our &lt;a href='http://msdn2.microsoft.com/en-us/library/ms752059.aspx' target='_blank'&gt;XAML&lt;/a&gt; code, I decided that I needed to load the combobox full of Genres as the first data call. Since I am allowing users to filter by Genre, the combobox will be the source of that filtering.&amp;nbsp; So I added the Behavior which looks like this in XAML:&lt;/p&gt;
&lt;pre&gt;&amp;lt;i:Interaction.Triggers&amp;gt;
  &amp;lt;i:EventTrigger EventName="Loaded"&amp;gt;
    &amp;lt;si:CallDataMethod Method="GetGenresAsync" /&amp;gt;
  &amp;lt;/i:EventTrigger&amp;gt;
&amp;lt;/i:Interaction.Triggers&amp;gt;&lt;/pre&gt;
&lt;p&gt;The behavior simply reacts to the UserControl's &lt;strong&gt;Loaded&lt;/strong&gt; event (so that this fires when the &lt;a href='http://msdn2.microsoft.com/en-us/library/ms752059.aspx' target='_blank'&gt;XAML&lt;/a&gt; is loaded) and calls the &lt;strong&gt;GetGenresAsync&lt;/strong&gt; method. If you look at our interface, you will notice that &lt;strong&gt;GetGenresAsync&lt;/strong&gt; method takes no parameters which is one of the signatures that the &lt;strong&gt;CallDataMethod&lt;/strong&gt; behaviors supports.&lt;/p&gt;
&lt;p&gt;When the Loaded event fires, the behavior calls &lt;strong&gt;GetGenresAsync&lt;/strong&gt; which starts the call to the server to get the data.&amp;nbsp; When that operation comples, the &lt;strong&gt;ViewModel&lt;/strong&gt; simply fills in the &lt;strong&gt;Genres&lt;/strong&gt; into the &lt;strong&gt;Genres&lt;/strong&gt; collection on the &lt;strong&gt;ViewModel&lt;/strong&gt; so that it is shown in UI.&amp;nbsp; We could throw an event to the UI, but that's not necessary because the same return can show the error information. How?&amp;nbsp; Let's look at the &lt;strong&gt;ViewModel&lt;/strong&gt; code:&lt;/p&gt;
&lt;pre&gt;void theModel_OnGenresCompleted(object sender, EntityEventArgs&amp;lt;Genre&amp;gt; e)
{
  if (e.Error != null)
  {
    &lt;strong&gt;ErrorMessage&lt;/strong&gt; = e.Error.ToString();
  }
  else
  {
    theGenres.Clear();

    foreach (var g in e.Results.OrderBy(g =&amp;gt; g.Name))
    {
      theGenres.Add(g);
    }
  }

  IsBusy = false;
}
&lt;/pre&gt;
&lt;p&gt;Notice when the &lt;strong&gt;Genres&lt;/strong&gt; are returned from the server that we are sending in whether there was an error.&amp;nbsp; And if an error was returned, we simply set the string on an &lt;strong&gt;ErrorMessage&lt;/strong&gt; property. This is a property that the UI is data bound to in order to show the error.&amp;nbsp; This way we still don't need an event thrown to the UI to communicate the error. This is a pattern in ViewModels I use quite a lot as it helps our UI's stay declarative and clean.&lt;/p&gt;
&lt;p&gt;To load the DataGrid with games, I needed to use the CallDataMethod trigger again. But in this case, I need to be able to tell the ViewModel which Genre was selected. The &lt;strong&gt;CallDataMethod&lt;/strong&gt; takes a very simple approach and simply will allow you to use the standard event syntax as well (see how the interface supports the standard event signature of an object and an EventArgs):&lt;/p&gt;
&lt;pre&gt;&amp;lt;ComboBox x:Name="Genres"
          HorizontalAlignment="Left"
          Margin="8,2,0,0"
          Width="150"
          Grid.Row="1"
          DisplayMemberPath="Name"
          ItemsSource="{Binding Genres, Mode=OneWay}"&amp;gt;
  &lt;strong&gt;&amp;lt;i:Interaction.Triggers&amp;gt;
    &amp;lt;i:EventTrigger EventName="SelectionChanged"&amp;gt;
      &amp;lt;si:CallDataMethod Method="GetGamesByGenreAsync" /&amp;gt;
    &amp;lt;/i:EventTrigger&amp;gt;
  &amp;lt;/i:Interaction.Triggers&amp;gt;&lt;/strong&gt;
&amp;lt;/ComboBox&amp;gt;&lt;/pre&gt;
&lt;p&gt;So when the SelectionChanged event is fired on the combobox, we call the GetGamesByGenreAsync method.&amp;nbsp; That method has the standard event syntax so that in the event we can retrieve the selected Genre:&lt;/p&gt;
&lt;pre&gt;public void GetGamesByGenreAsync(object sender, EventArgs e)
{
  IsBusy = true;
  var sel = sender as Selector;
  if (sel != null &amp;amp;&amp;amp; sel.SelectedItem is Genre)
  {
    theModel.GetGamesByGenreAsync(((Genre)sel.SelectedItem).Name);
  }
}&lt;/pre&gt;
&lt;p&gt;Note that this method assumes that the UI is using some sort of &lt;strong&gt;Selector&lt;/strong&gt; (from which &lt;strong&gt;ListBox&lt;/strong&gt;, &lt;strong&gt;ComboBox&lt;/strong&gt; and &lt;strong&gt;ItemsControl&lt;/strong&gt; all derive) which is a concession to the separation. But if it weren't a &lt;strong&gt;Selector&lt;/strong&gt;, we could probably craft this same experience with other behaviors. Because we can get the selected element from the Selector, our View still is very declarative.&lt;/p&gt;
&lt;p&gt;This is why I think declarative UIs are so powerful. We are leaving all the look and feel of the application directly in the markup. So that the &lt;a href='http://msdn2.microsoft.com/en-us/library/ms752059.aspx' target='_blank'&gt;XAML&lt;/a&gt; is self describing and it makes it harder to write business logic code in the user interface.&amp;nbsp; That should be left in the other tiers where it belongs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So Declarative User Interfaces are Code-less?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The answer is yes and no. While declarative user interfaces can be codeless in many cases, it should not be dogmatic. If it makes sense to write code in a view, write the code.&amp;nbsp; The power here is to do most of the work required in the markup itself. Purity for purity sake is not helpful. But if you do write code in your view, it better not be business logic.&amp;nbsp; If you need business logic, communicate back to the VM or with the data objects themselves. That's where it belongs.&lt;/p&gt;
&lt;p&gt;You can get the source to this sample here (which includes both an "AfterBlend" version and a "AfterVS" version):&lt;/p&gt;
&lt;p&gt;&lt;a href="http://wildermuth.com/downloads/declarativeui.zip"&gt;http://wildermuth.com/downloads/declarativeui.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What do you think?&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/09/02/Why_Declarative_UIs_Are_Important'&gt;3 Comment(s)&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f09%2f02%2fWhy_Declarative_UIs_Are_Important&amp;title=Why+Declarative+UIs+Are+Important' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f09%2f02%2fWhy_Declarative_UIs_Are_Important" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/rsLeAzj2fYo" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/09/02/Why_Declarative_UIs_Are_Important</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/09/02/Why_Declarative_UIs_Are_Important</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/09/02/Why_Declarative_UIs_Are_Important</guid>
      <pubDate>Wed, 02 Sep 2009 11:42:50 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2788</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2788</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">3</slash:comments>
    </item>
    <item>
      <title>My SketchFlow .NET Rocks TV Episode is up (DNR-TV)</title>
      <description>&lt;div nowrap&gt;&lt;strong&gt;URL&lt;/strong&gt;: &lt;a href='http://dnrtv.com/default.aspx?ShowID=148' target=_blank&gt;http://dnrtv.com/default.aspx?ShowID=148&lt;/a&gt;&lt;/div&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://www.silverlight-tour.com"&gt;&lt;img style="float:right;" src="http://wildermuth.com/images/silverlightlogo100.jpg" alt="Silverlight Logo" /&gt;&lt;/a&gt;I am excited to announce that my new DNR-TV episode is up at .NET Rocks. Carl and I visited while we were both at DevTeach to show off Blend's new SketchFlow functionality. If you have time, give it a spin!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/08/31/My_SketchFlow_NET_Rocks_TV_Episode_is_up_(DNR-TV)'&gt;Add Comment&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f08%2f31%2fMy_SketchFlow_NET_Rocks_TV_Episode_is_up_(DNR-TV)&amp;title=My+SketchFlow+.NET+Rocks+TV+Episode+is+up+(DNR-TV)' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f08%2f31%2fMy_SketchFlow_NET_Rocks_TV_Episode_is_up_(DNR-TV)" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/e4GdXxGQZ6U" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/08/31/My_SketchFlow_NET_Rocks_TV_Episode_is_up_(DNR-TV)</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/08/31/My_SketchFlow_NET_Rocks_TV_Episode_is_up_(DNR-TV)</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/08/31/My_SketchFlow_NET_Rocks_TV_Episode_is_up_(DNR-TV)</guid>
      <pubDate>Mon, 31 Aug 2009 19:44:25 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2787</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2787</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments>
    </item>
    <item>
      <title>A Plethora of Silverlight Behaviors/Triggers</title>
      <description>&lt;div nowrap&gt;&lt;strong&gt;URL&lt;/strong&gt;: &lt;a href='http://expressionblend.codeplex.com/' target=_blank&gt;http://expressionblend.codeplex.com/&lt;/a&gt;&lt;/div&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://expressionblend.codeplex.com/"&gt;&lt;img style="float:right;" src="http://i.expression.microsoft.com/cc265059.100blend(en-us,MSDN.10).png" alt="Blend" width="100" height="100" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It looks like the &lt;a href='http://microsoft.com/expression' target='_blank'&gt;Expression&lt;/a&gt; team is skulking around and releasing code.&amp;nbsp;They've just released a bunch of behaviors on the new &lt;a href="http://expressionblend.codeplex.com/"&gt;Expression Blend Samples&lt;/a&gt; CodePlex project. The number of sample behaviors and triggers&amp;nbsp;is just staggering:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PlayMedia&lt;/li&gt;
&lt;li&gt;PauseMedia&lt;/li&gt;
&lt;li&gt;TogglePlayPauseMedia&lt;/li&gt;
&lt;li&gt;RewindMedia&lt;/li&gt;
&lt;li&gt;StopMedia&lt;/li&gt;
&lt;li&gt;MouseGestureTrigger&lt;/li&gt;
&lt;li&gt;MouseEventTrigger&lt;/li&gt;
&lt;li&gt;StateChangedTrigger&lt;/li&gt;
&lt;li&gt;CallDataMethod&lt;/li&gt;
&lt;li&gt;InvokeDataCommand&lt;/li&gt;
&lt;li&gt;DataEventTrigger&lt;/li&gt;
&lt;li&gt;SetDataProperty&lt;/li&gt;
&lt;li&gt;DataStateBehavior&lt;/li&gt;
&lt;li&gt;DataStateSwitchBehavior&lt;/li&gt;
&lt;li&gt;FluidBindProperty&lt;/li&gt;
&lt;li&gt;PropertyChangedTrigger&lt;/li&gt;
&lt;li&gt;CallMethod&lt;/li&gt;
&lt;li&gt;ClippingBehavior&lt;/li&gt;
&lt;li&gt;GoToNextState&lt;/li&gt;
&lt;li&gt;GoToPreviousState&lt;/li&gt;
&lt;li&gt;SetProperty&lt;/li&gt;
&lt;li&gt;ShowMessageBox&lt;/li&gt;
&lt;li&gt;ListBoxAddOne&lt;/li&gt;
&lt;li&gt;ListBoxRemoveOne&lt;/li&gt;
&lt;li&gt;ListBoxRemoveThisItem&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wow, that's impressive.&amp;nbsp; The code is only in Alpha, but the installer does add it to the Blend directory.&amp;nbsp; Go get them now....run don't walk:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://expressionblend.codeplex.com/"&gt;http://expressionblend.codeplex.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/08/25/A_Plethora_of_Silverlight_Behaviors_Triggers'&gt;3 Comment(s)&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f08%2f25%2fA_Plethora_of_Silverlight_Behaviors_Triggers&amp;title=A+Plethora+of+Silverlight+Behaviors%2fTriggers' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f08%2f25%2fA_Plethora_of_Silverlight_Behaviors_Triggers" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/ed5LAqYJuBo" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/08/25/A_Plethora_of_Silverlight_Behaviors_Triggers</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/08/25/A_Plethora_of_Silverlight_Behaviors_Triggers</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/08/25/A_Plethora_of_Silverlight_Behaviors_Triggers</guid>
      <pubDate>Tue, 25 Aug 2009 21:06:52 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2786</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2786</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">3</slash:comments>
    </item>
    <item>
      <title>One Week Left Before Seattle's Silverlight Tour Stop</title>
      <description>&lt;div nowrap&gt;&lt;strong&gt;URL&lt;/strong&gt;: &lt;a href='https://agilitrain.com/Workshop/Info/Silverlight_Tour_Workshop' target=_blank&gt;https://agilitrain.com/Workshop/Info/Silverligh...&lt;/a&gt;&lt;/div&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://www.silverlight-tour.com"&gt;&lt;img style="float:right;" src="http://wildermuth.com/images/stlogo.png" alt="Silverlight Tour" width="234" height="100" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Are you ready...for &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; 3? If not, now's your time to ramp up in three days.&amp;nbsp; The &lt;a href='http://www.silverlight-tour.com' target='_blank'&gt;Silverlight Tour&lt;/a&gt; is coming back to Seattle next week.&amp;nbsp; It arrives on September 2nd in Bellevue and there are still seats available.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The new &lt;a href="http://wildermuth.com/silverlight" target="_blank"&gt;&lt;strong&gt;Silverlight&lt;/strong&gt;&lt;/a&gt; 3 features&amp;nbsp;covered include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Out of the Browser Support&lt;/li&gt;
&lt;li&gt;Pixel Shaders &lt;/li&gt;
&lt;li&gt;Hardware Graphic Accelleration &lt;/li&gt;
&lt;li&gt;Behaviors &lt;/li&gt;
&lt;li&gt;Navigation Framework &lt;/li&gt;
&lt;li&gt;Blend 3 &lt;/li&gt;
&lt;li&gt;Binding Improvements &lt;/li&gt;
&lt;li&gt;Secure Web Services &lt;/li&gt;
&lt;li&gt;Binary XML Transport &lt;/li&gt;
&lt;li&gt;RIA Services Client Controls &lt;/li&gt;
&lt;li&gt;Text Rendering Improvements&lt;/li&gt;
&lt;li&gt;Render Caching&lt;/li&gt;
&lt;li&gt;And more...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To sign up for the class or hold a seat, visit the registration site:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://silverlight-tour.com/"&gt;&lt;strong&gt;http://silverlight-tour.com&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/08/24/One_Week_Left_Before_Seattle_s_Silverlight_Tour_Stop'&gt;Add Comment&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f08%2f24%2fOne_Week_Left_Before_Seattle_s_Silverlight_Tour_Stop&amp;title=One+Week+Left+Before+Seattle's+Silverlight+Tour+Stop' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f08%2f24%2fOne_Week_Left_Before_Seattle_s_Silverlight_Tour_Stop" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/FdpCYZbUN3w" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/08/24/One_Week_Left_Before_Seattle_s_Silverlight_Tour_Stop</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/08/24/One_Week_Left_Before_Seattle_s_Silverlight_Tour_Stop</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/08/24/One_Week_Left_Before_Seattle_s_Silverlight_Tour_Stop</guid>
      <pubDate>Mon, 24 Aug 2009 12:48:51 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2785</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2785</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments>
    </item>
    <item>
      <title>The Application Class and Application Services in Silverlight 3</title>
      <description>&lt;div nowrap&gt;&lt;strong&gt;URL&lt;/strong&gt;: &lt;a href='http://wildermuth.com/downloads/FunWithAppServices.zip' target=_blank&gt;http://wildermuth.com/downloads/FunWithAppServi...&lt;/a&gt;&lt;/div&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://www.silverlight-tour.com"&gt;&lt;img style="float:right;" src="http://wildermuth.com/images/silverlightlogo100.jpg" alt="Silverlight Logo" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;While digging into &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; 3, I noticed an oft overlooked new feature: Application Services. The problem revolves around the Application class so let's talk about that class first, then i'll get ot the services.&lt;/p&gt;
&lt;p&gt;In &lt;a href='http://msdn2.microsoft.com/en-us/vstudio/default.aspx' target='_blank'&gt;Visual Studio&lt;/a&gt; (or Blend), the Application class represents a pretty important piece of the runtime environment. In fact (much to a surprise to some &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; Dev's), the Main Page &lt;a href='http://msdn2.microsoft.com/en-us/library/ms752059.aspx' target='_blank'&gt;XAML&lt;/a&gt; file is not the first thing loaded. Typically the first thing loaded is the Application class (the class behind the app.xaml file). How does it know to load this class?&amp;nbsp; The AppManifest.xaml file.&amp;nbsp; Ok, let's dive a little deeper.&lt;/p&gt;
&lt;p&gt;When you build a &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; application, it creates a .xap file with your assembly and other resources (other assemblies, images, fonts, etc.) that are needed by your application. In addition, it creates a final &lt;strong&gt;AppManifest.xaml &lt;/strong&gt;file for the .xap file.&amp;nbsp; Here's a sample:&lt;/p&gt;
&lt;pre&gt;&amp;lt;Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
&lt;strong&gt;           EntryPointAssembly="FunWithAppServices"
&lt;/strong&gt;            &lt;strong&gt;EntryPointType="FunWithAppServices.App"&lt;/strong&gt;
            RuntimeVersion="3.0.40624.0"&amp;gt;
  &amp;lt;Deployment.Parts&amp;gt;
    &lt;strong&gt;&amp;lt;AssemblyPart x:Name="FunWithAppServices"
                  Source="FunWithAppServices.dll" /&amp;gt;&lt;/strong&gt;
    &amp;lt;AssemblyPart x:Name="MyAppService"
                  Source="MyAppService.dll" /&amp;gt;
  &amp;lt;/Deployment.Parts&amp;gt;
&amp;lt;/Deployment&amp;gt;&lt;/pre&gt;
&lt;p&gt;This AppManifest.xaml file is created during the build (which is why it looks different from the one in your project). Not that there are two attributes that describe the EntryPoint to the .xap file.&amp;nbsp; This tells the runtime which assembly to load and what type to create to start the application.&lt;/p&gt;
&lt;p&gt;When the application class (called App in the default templates) is loaded, it starts the whole process for creating an instance of the MainPage as shown below:&lt;/p&gt;
&lt;pre&gt;public partial class App : Application
{

  public App()
  {
    &lt;strong&gt;this.Startup += this.Application_Startup;&lt;/strong&gt;
    this.Exit += this.Application_Exit;
    this.UnhandledException += this.Application_UnhandledException;

    InitializeComponent();
  }

  private void Application_Startup(object sender, StartupEventArgs e)
  {
    &lt;strong&gt;this.RootVisual = new MainPage();&lt;/strong&gt;
  }

...
}&lt;/pre&gt;
&lt;p&gt;So why does any of this matter? Because the Application lives for the life of the&amp;nbsp;application. Therefore many developers find&amp;nbsp;it a common place&amp;nbsp;to hang other functionality. In fact,&amp;nbsp;some frameworks help by&amp;nbsp;getting you to derive your App class from another class&amp;nbsp;to provide even more functionality. Of course, as soon as you need/want two of these sets of functionality, you're stuck because you can't multi-derive in .NET.&lt;/p&gt;
&lt;p&gt;The problem with this is as different services to the application are necessary, the App class gets busy and hard to maintain. This is especially hard to loosely couple these services with the application. The main reason many developers put these services on the App class is to ensure that those services are available through the lifetime of the application. In &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt; 3, &lt;a href='http://microsoft.com' target='_blank'&gt;Microsoft&lt;/a&gt; has come up with another option: &lt;em&gt;Application Services&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The idea of Application Services is pretty simple: any&amp;nbsp;set of functionality that&amp;nbsp;needs to have the same lifetime as the Application.&amp;nbsp;&amp;nbsp;An Application Service is a class that supports the &lt;strong&gt;IApplicationService &lt;/strong&gt;interface (and optionally &lt;strong&gt;IApplicationLifetimeAware&lt;/strong&gt;).&amp;nbsp;IApplicationService is simple:&lt;/p&gt;
&lt;pre&gt;public interface IApplicationService
{
  void StartService(ApplicationServiceContext context);
  void StopService();
}&lt;/pre&gt;
&lt;p&gt;The interface supports starting and stopping of the&amp;nbsp;service (as well as sharing application startup initParams). I might have a&amp;nbsp;Logger service that I want to use in my&amp;nbsp;Silverlight app. If I implement the interface, I can then set up this service in the &lt;strong&gt;App.xaml &lt;/strong&gt;file to start up with the applicaton using the Application.ApplicationLifetimeObjects element:&lt;/p&gt;
&lt;pre&gt;&amp;lt;Application xmlns="..."
             xmlns:x="..." 
             x:Class="..."
             xmlns:s="clr-namespace:MyAppService;assembly=MyAppService"
             &amp;gt;
&lt;strong&gt;  &amp;lt;Application.ApplicationLifetimeObjects&amp;gt;
    &amp;lt;s:Logger /&amp;gt;
  &amp;lt;/Application.ApplicationLifetimeObjects&amp;gt;
&lt;/strong&gt;  ...
&amp;lt;/Application&amp;gt;&lt;/pre&gt;
&lt;p&gt;The problem with this&amp;nbsp;facility is that while the&lt;strong&gt; ApplicaitonLifetimeObjects&lt;/strong&gt; is handling the lifetime for you, there is not a simple way to get the object. That's why &lt;a href='http://microsoft.com' target='_blank'&gt;Microsoft&lt;/a&gt; advises to create a static &lt;strong&gt;Current&lt;/strong&gt; property like so:&lt;/p&gt;
&lt;pre&gt;public class Logger : IApplicationService, IApplicationLifetimeAware
{
&lt;strong&gt;  static Logger _current = null;
&lt;/strong&gt;
&lt;strong&gt;  public static Logger Current
  {
    get { return _current; }
  }
&lt;/strong&gt;
  void IApplicationService.StartService(
    ApplicationServiceContext context)
  {
&lt;strong&gt;    _current = this;  
&lt;/strong&gt;  }

  void IApplicationService.StopService()
  {
&lt;strong&gt;    _current = null;
&lt;/strong&gt;  }
...
}
&lt;/pre&gt;
&lt;p&gt;In addition to the &lt;strong&gt;IApplicationService&lt;/strong&gt;, another useful interface here is the &lt;strong&gt;IApplicationLifetimeAware&lt;/strong&gt; interface. This interface gives you a bit more&amp;nbsp;control in the starting and stopping of the service.&amp;nbsp; Here's the interface:&lt;/p&gt;
&lt;pre&gt;public interface IApplicationLifetimeAware
{
  void Starting();
  void Started();
  void Exiting();
  void Exited();
}&lt;/pre&gt;
&lt;p&gt;This interface simply allows you to handle the before and after states of Starting and Exiting the service.&amp;nbsp; This is useful when you need that extra level of granularity.&lt;/p&gt;
&lt;p&gt;the Application Service model allows for better separation between lifetime management and services that you want to supply to your Silverlight&amp;nbsp;application. Start using it and please pleave the App alone...please ;)&lt;/p&gt;
&lt;p&gt;Here's a link to my simple (and somewhat contrived) example:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://wildermuth.com/downloads/FunWithAppServices.zip"&gt;http://wildermuth.com/downloads/FunWithAppServices.zip&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/08/24/The_Application_Class_and_Application_Services_in_Silverlight_3'&gt;3 Comment(s)&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f08%2f24%2fThe_Application_Class_and_Application_Services_in_Silverlight_3&amp;title=The+Application+Class+and+Application+Services+in+Silverlight+3' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f08%2f24%2fThe_Application_Class_and_Application_Services_in_Silverlight_3" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/IWeaBSzBF_E" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/08/24/The_Application_Class_and_Application_Services_in_Silverlight_3</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/08/24/The_Application_Class_and_Application_Services_in_Silverlight_3</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/08/24/The_Application_Class_and_Application_Services_in_Silverlight_3</guid>
      <pubDate>Mon, 24 Aug 2009 12:00:22 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2783</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2783</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">3</slash:comments>
    </item>
    <item>
      <title>Augusta in August!</title>
      <description>&lt;div nowrap&gt;&lt;strong&gt;URL&lt;/strong&gt;: &lt;a href='http://augustadevelopers.org/Events/August2009/tabid/79/Default.aspx' target=_blank&gt;http://augustadevelopers.org/Events/August2009/...&lt;/a&gt;&lt;/div&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://www.silverlight-tour.com"&gt;&lt;img style="float:right;" src="http://wildermuth.com/images/silverlightlogo100.jpg" alt="Silverlight Logo" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you are in or around the Augusta area this Thursday, I will be doing my "Introduction to Silverlight" talk. Certain to start a conversation, this talk presents the basics of the platform and some examples of best uses for &lt;a href='http://wildermuth.com/silverlight' target='_blank'&gt;Silverlight&lt;/a&gt;. The event information is:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Augusta Developers Guild &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;When&lt;/em&gt;: Thursday, August 27, 2009 @ 6PM&lt;br /&gt;&lt;em&gt;Where&lt;/em&gt;: Augusta State University, University Hall, Room 170 ( &lt;a href="http://www.aug.edu/public_relations/pr_map_campus.htm"&gt;&lt;span style="color: #003366;"&gt;&lt;span style="text-decoration: underline;"&gt;Directions&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; )&lt;/p&gt;
&lt;p&gt;Hope to see you there!&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/08/24/Augusta_in_August!'&gt;Add Comment&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f08%2f24%2fAugusta_in_August!&amp;title=Augusta+in+August!' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f08%2f24%2fAugusta_in_August!" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/dGH2HOXV9Nc" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/08/24/Augusta_in_August!</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/08/24/Augusta_in_August!</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/08/24/Augusta_in_August!</guid>
      <pubDate>Mon, 24 Aug 2009 10:28:16 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2784</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2784</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments>
    </item>
    <item>
      <title>PHP toolkit for ADO.NET Data Services...And My XBox Demo</title>
      <description>&lt;div nowrap&gt;&lt;strong&gt;URL&lt;/strong&gt;: &lt;a href='http://blogs.msdn.com/pablo/archive/2009/08/21/php-client-for-ado-net-data-services.aspx' target=_blank&gt;http://blogs.msdn.com/pablo/archive/2009/08/21/...&lt;/a&gt;&lt;/div&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://www.silverlight-tour.com"&gt;&lt;img style="float:right;" src="http://wildermuth.com/images/ADODataServices.jpg" alt="Silverlight Logo" width="182" height="278" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I am happy to see that the Data Programming group at &lt;a href='http://microsoft.com' target='_blank'&gt;Microsoft&lt;/a&gt; have been hard at work as usual. They've just released their PHP toolkit for &lt;a href='http://astoria.mslivelabs.com' target='_blank'&gt;ADO.NET Data Services&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While I had no part in this effort, I was estastic to see they ported my XBox Games example to PHP for the demo of the toolkit.&amp;nbsp; If you're using PHP and don't know much about &lt;a href='http://msdn.microsoft.com/data' target='_blank'&gt;ADO.NET&lt;/a&gt; Data Services, go grab the toolkit and take a look.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;copy; 2009 Shawn Wildermuth. All Rights Reserved.&lt;br/&gt;&lt;a href='http://wildermuth.com/2009/08/21/PHP_toolkit_for_ADO_NET_Data_Services_And_My_XBox_Demo'&gt;Add Comment&lt;/a&gt; | &lt;a href='http://digg.com/submit?phase=2&amp;url=http%3a%2f%2fwildermuth.com%2f2009%2f08%2f21%2fPHP_toolkit_for_ADO_NET_Data_Services_And_My_XBox_Demo&amp;title=PHP+toolkit+for+ADO.NET+Data+Services...And+My+XBox+Demo' target='_blank'&gt;digg this&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;script src="http://feeds.feedburner.com/~s/shawnwildermuth?i=http%3a%2f%2fwildermuth.com%2f2009%2f08%2f21%2fPHP_toolkit_for_ADO_NET_Data_Services_And_My_XBox_Demo" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;[advertisement]&lt;br/&gt;The Silverlight Tour is a three-day workshop covering topics from XAML and Blend to data access and server scenarios. For more information, see our website at &lt;a href='http://silverlight-tour.com' target=_blank&gt;http://silverlight-tour.com&lt;/a&gt;. &lt;a href='http://silverlight-tour.com' target=_blank&gt;&lt;img src='http://wildermuth.com/images/smalllogo.png' style='float: right;' alt='Silverlight Tour' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ShawnWildermuth/~4/z_rhEulpJC8" height="1" width="1"/&gt;</description>
      <link>http://wildermuth.com/2009/08/21/PHP_toolkit_for_ADO_NET_Data_Services_And_My_XBox_Demo</link>
      <author>shawn@wildermuth.com (Shawn Wildermuth)</author>
      <comments>http://wildermuth.com/2009/08/21/PHP_toolkit_for_ADO_NET_Data_Services_And_My_XBox_Demo</comments>
      <guid isPermaLink="false">http://wildermuth.com/2009/08/21/PHP_toolkit_for_ADO_NET_Data_Services_And_My_XBox_Demo</guid>
      <pubDate>Fri, 21 Aug 2009 15:01:06 GMT</pubDate>
      <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/commentrss.aspx?id=2782</wfw:commentRss>
      <wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://wildermuth.com/rss/addcomment.aspx?id=2782</wfw:comment>
      <slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments>
    </item>
  </channel>
</rss>
