<?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:dc="http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0"><channel><title>the Joy of Code</title><link>http://www.thejoyofcode.com/</link><description>Find out more at thejoyofcode.com</description><image><url>http://www.thejoyofcode.com/App_Themes/BlueParadise/images/logo.gif</url><title>The Joy Of Code</title><link>http://www.thejoyofcode.com/</link><width>88</width><height>31</height></image><language>en-gb</language><docs>http://blogs.law.harvard.edu/tech/rss</docs><generator>http://www.thejoyofcode.com/</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/TheJoyOfCode" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>Silverlight out-of-browser and initParams</title><link>http://www.thejoyofcode.com/Silverlight_out_of_browser_and_initParams.aspx</link><description>Silverlight 3 supports a very cool 'deployment model' where you can run the Silverlight Application 'out-of-browser' (OOB) and kick it off from your start menu. It even works offline. This is the future, get to like it.&lt;p /&gt;However, because the plug-in is no longer hosted in your page you lose all those juicy settings and, perhaps worst of all, you &lt;strong&gt;initialization parameters&lt;/strong&gt; aren't available when the app runs OOB. This is frustrating because a lot of people pass in settings from their host web-application's web.config file using this very mechanism.&lt;p /&gt;However, it only takes a little bit of code to work around this scenario by caching the initParams in isolated storage whenever the applicaiton is run &lt;strong&gt;in-browser&lt;/strong&gt;. Here's some code that does just that:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; Application_Startup(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt; sender, StartupEventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var mp &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; MainPage();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;this&lt;/span&gt;.RootVisual &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; mp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IDictionary&amp;lt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt;, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt;&amp;gt; initParams &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; LoadInitParams(e);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// this just adds the init params to the MainPage for demo purposes only&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;foreach&lt;/span&gt; (var kv &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;in&lt;/span&gt; initParams)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mp.LayoutRoot.Children.Add(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; TextBlock { Text &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; kv.Key, FontStyle &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; FontStyles.Italic });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mp.LayoutRoot.Children.Add(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; TextBlock { Text &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; kv.Value, Margin &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; Thickness(5,0,0,0) });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;static&lt;/span&gt; IDictionary&amp;lt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt;, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt;&amp;gt; LoadInitParams(StartupEventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IDictionary&amp;lt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt;, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt;&amp;gt; initParams;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// if running out of browser retrieve 'initParams' from cache&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;if&lt;/span&gt; (Application.Current.IsRunningOutOfBrowser)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;using&lt;/span&gt; (IsolatedStorageFile isf &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; IsolatedStorageFile.GetUserStoreForApplication())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;using&lt;/span&gt; (IsolatedStorageFileStream stream &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; IsolatedStorageFileStream(&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"initParams.txt"&lt;/span&gt;, System.IO.FileMode.Open, isf))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DataContractSerializer ser &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; DataContractSerializer(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;typeof&lt;/span&gt;(Dictionary&amp;lt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt;, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt;&amp;gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;initParams &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; (Dictionary&amp;lt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt;, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt;&amp;gt;)ser.ReadObject(stream);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// otherwise write initParams to cache&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;initParams &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; e.InitParams;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;using&lt;/span&gt; (IsolatedStorageFile isf &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; IsolatedStorageFile.GetUserStoreForApplication())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;using&lt;/span&gt; (IsolatedStorageFileStream stream &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; IsolatedStorageFileStream(&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"initParams.txt"&lt;/span&gt;, System.IO.FileMode.Create, isf))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DataContractSerializer ser &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; DataContractSerializer(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;typeof&lt;/span&gt;(Dictionary&amp;lt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt;, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt;&amp;gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ser.WriteObject(stream, initParams);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; initParams;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

Easy peasy.&lt;p /&gt;One recommendation here though is that you probably want a layer of indirection between Initalization Parameters and your 'silverlight configuration' in this case. The reason for this is the initParams will only get updated when you run the app &lt;strong&gt;in-browser&lt;/strong&gt;. It's possible that your user will never run the app in-browser again. And even if the XAP gets updated your new parameters may never be seen, unless the app runs in-browser. So I'd recommend storing a static and constant URL in your initParameters that specifies an XML file (or web service) on the web server that contains your silverlight configuration. &lt;p /&gt;You can then download this at will, even out-of-browser, whenever the network is available.
        &lt;img src="http://www.thejoyofcode.com/feed.gif?Silverlight out-of-browser and initParams" width="1" height="1" alt="" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=JQX4yt_uHmE:cdA6mBtv7_A:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=JQX4yt_uHmE:cdA6mBtv7_A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Wed, 21 Oct 2009 13:26:06 GMT</pubDate><dc:date>2009-10-21T13:26:06.897Z</dc:date><guid isPermaLink="true">http://www.thejoyofcode.com/Silverlight_out_of_browser_and_initParams.aspx</guid><dc:creator>Josh Twist</dc:creator><category>Silverlight</category><slash:comments>0</slash:comments><comments>http://www.thejoyofcode.com/Silverlight_out_of_browser_and_initParams.aspx#comments</comments><wfw:commentRss>http://www.thejoyofcode.com/Feed.ashx?feed=%2FComments%2FRSS_2-0&amp;PostId=7a107764-658e-434f-9d71-77a8c2f15b9b</wfw:commentRss></item><item><title>Five minute recipe for a decent BoolToVisibilityConverter</title><link>http://www.thejoyofcode.com/Five_minute_recipe_for_a_decent_BoolToVisibilityConverter.aspx</link><description>There are a bunch of IValueConverters that WPF probably should ship with... MultiplyConverter, AdditionConverter etc. Rather oddly it does ship with one: The BooleanToVisibilityConverter:&lt;p /&gt;However, I'm not a huge fan of the implementation as it gives me little control over what &lt;strong&gt;true&lt;/strong&gt; and &lt;strong&gt;false&lt;/strong&gt; actually map to. For example, should false be Collapsed or Visible? What if I want to invert? For these reasons I always craft my own (I really must start a codeplex project at some point to keep all these converters). Here it is:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;class&lt;/span&gt; BoolToVisibilityConverter : MarkupExtension, IValueConverter&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; BoolToVisibilityConverter()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TrueValue &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; Visibility.Visible;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FalseValue &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; Visibility.Collapsed;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; Visibility TrueValue { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; Visibility FalseValue { get; set; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt; Convert(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt; value, Type targetType, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt; parameter, System.Globalization.CultureInfo culture)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;bool&lt;/span&gt; val &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; System.Convert.ToBoolean(value);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; val ? TrueValue : FalseValue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt; ConvertBack(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt; value, Type targetType, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt; parameter, System.Globalization.CultureInfo culture)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; TrueValue.Equals(value) ? &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;true&lt;/span&gt; : &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;override&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt; ProvideValue(IServiceProvider serviceProvider)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;this&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

As discussed in a previous post, I've used my &lt;a href="http://www.thejoyofcode.com/WPF_Quick_Tip_Converters_as_MarkupExtensions.aspx"&gt;Converters as MarkupExtensions tip&lt;/a&gt; but I've also made the TrueValue and FalseValue completely configurable so there's a clear route for both inversion and choice between Collapsed and Hidden. In fact, you could even have True==Collapsed and False==Hidden if you liked - not sure what you'd use that for though. Note that we set sensible defaults in the constructor.&lt;p /&gt;Here's how to use it:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;StackPanel&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;VerticalAlignment&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Bottom"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;StackPanel.Resources&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;local:BoolToVisibilityConverter&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;FalseValue&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Collapsed"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Key&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="btvc"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/StackPanel.Resources&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;CheckBox&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="HideOrShowCheck"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;Hide or show the text...&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;CheckBox&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;TextBlock&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Text&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Hello World!"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Visibility&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=HideOrShowCheck, Path=IsChecked,Converter={StaticResource btvc}}"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;StackPanel&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;

Or, my preferred way:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;StackPanel&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;VerticalAlignment&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Bottom"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;CheckBox&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="HideOrShowCheck"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;Hide or show the text...&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;CheckBox&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;TextBlock&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Text&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Hello World!"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Visibility&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=HideOrShowCheck, Path=IsChecked,Converter={local:BoolToVisibilityConverter FalseValue=Collapsed}}"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;StackPanel&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;

Happy converting.
        &lt;img src="http://www.thejoyofcode.com/feed.gif?Five minute recipe for a decent BoolToVisibilityConverter" width="1" height="1" alt="" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=hM6QSYVehUw:vIsVJIVLzkM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=hM6QSYVehUw:vIsVJIVLzkM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Mon, 12 Oct 2009 09:26:55 GMT</pubDate><dc:date>2009-10-12T09:26:55.787Z</dc:date><guid isPermaLink="true">http://www.thejoyofcode.com/Five_minute_recipe_for_a_decent_BoolToVisibilityConverter.aspx</guid><dc:creator>Josh Twist</dc:creator><category>WPF</category><category>Silverlight</category><slash:comments>1</slash:comments><comments>http://www.thejoyofcode.com/Five_minute_recipe_for_a_decent_BoolToVisibilityConverter.aspx#comments</comments><wfw:commentRss>http://www.thejoyofcode.com/Feed.ashx?feed=%2FComments%2FRSS_2-0&amp;PostId=ddaf58fc-eccb-4146-a3ce-928f57a1ca78</wfw:commentRss></item><item><title>MultiBinding for Silverlight 3</title><link>http://www.thejoyofcode.com/MultiBinding_for_Silverlight_3.aspx</link><description>One of the key binding features missing from Silverlight 3 is MultiBinding and IMultiValueConverter support. In this post I'll walk through a custom implementation that uses a few tricks that you may want to leverage elsewhere.&lt;p /&gt;First of all, I wanted to re-create the IMultiValueConverter from WPF in it's entirety. Here it is:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;interface&lt;/span&gt; IMultiValueConverter&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt; Convert(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt;[] values, Type targetType, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt; parameter, CultureInfo culture);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt;[] ConvertBack(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt; value, Type[] targetTypes, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt; parameter, CultureInfo culture);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

That was easy. Now for the actual MultiBinding. In WPF a MultiBinding looks like this:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;TextBlock&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="textBox2"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;DataContext&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{StaticResource NameListData}"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;TextBlock.Text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;MultiBinding&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Converter&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{StaticResource myNameConverter}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;ConverterParameter&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="FormatLastFirst"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Binding&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Path&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="FirstName"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Binding&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Path&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="LastName"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;MultiBinding&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/TextBlock.Text&amp;gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;TextBlock&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

Ideally I'd have liked to recreate this for Silverlight but without support for custom MarkupExtensions that's just not happening. Instead, we'll have to use another trick where we implement a &lt;strong&gt;non-visual FrameworkElement&lt;/strong&gt;. We use a FrameworkElement because we want DependencyProperties that support Bindings and these have to belong to FrameworkElement in Silverlight (a DependencyObject isn't good enough in SL3 as it is in WPF). No matter. &lt;p /&gt;The other trick is that we have to add this element to the Visual Tree. What? Yes, I know, it feels like a hack but really it isn't. Even the RIA team do it so it must be OK. The key thing is that our element is non-visual so it doesn't contribute to the Render pipeline (has 0x0 size etc...). This is what it might look like in use:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;binding:MultiBinding&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="mb"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Converter&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{StaticResource intsToBrushConverter}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;NumberOfInputs&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="3"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Input1&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=red, Path=Value, Mode=TwoWay}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Input2&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=green, Path=Value, Mode=TwoWay}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Input3&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=blue, Path=Value, Mode=TwoWay}"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Border&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Background&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=mb, Path=Output}"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Margin&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="5"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;StackPanel&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Orientation&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Horizontal"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;HorizontalAlignment&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Center"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;/span&gt; Grid.Row="1"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Slider&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="red"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Minimum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="0"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Maximum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="255"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Margin&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="5"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Orientation&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Vertical"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Slider&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="green"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Minimum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="0"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Maximum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="255"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Margin&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="5"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Orientation&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Vertical"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Slider&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="blue"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Minimum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="0"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Maximum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="255"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Margin&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="5"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Orientation&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Vertical"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;StackPanel&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

You might have guessed that I'm creating a Color Selector control. Wanna' see it in action? Go on then (&lt;a href="http://www.thejoyofcode.com/MultiBinding_for_Silverlight_3.aspx"&gt;can't see it? click here&lt;/a&gt;).

&lt;script type="text/javascript" src="http://www.thejoyofcode.com/Silverlight.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
function createSilverlight_multibindingDemo()
{
Silverlight.createObjectEx({
source: "http://www.thejoyofcode.com/uploads/multibinding.xap",
parentElement: document.getElementById("createSilverlight_multibindingDemo"),
id: "SilverlightControl",
properties: {
width: "450px",
height: "450px",
version: "3.0",
enableHtmlAccess: "true"
},
events: {
onError: null,
onLoad: null
}});
}
&lt;/script&gt;

&lt;p/&gt;
&lt;div id="createSilverlight_multibindingDemo"&gt;
&lt;script type="text/javascript"&gt;
createSilverlight_multibindingDemo();
&lt;/script&gt;
&lt;/div&gt;
&lt;p/&gt;

Here's the BrushConverter (IMultiConverter) that's used by the MultiBinding:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;public class IntsToBrushConverter : IMultiValueConverter&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte r = System.Convert.ToByte(values[0]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte g = System.Convert.ToByte(values[1]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte b = System.Convert.ToByte(values[2]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return new SolidColorBrush(Color.FromArgb(Byte.MaxValue, r, g, b));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SolidColorBrush brush = (SolidColorBrush)value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return new object[] { brush.Color.R, brush.Color.G, brush.Color.B };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

Easy peasy. Want the code? Go on then:

&lt;ul&gt;
	&lt;li&gt;Usual disclaimers apply - this is demoware and used very much at your own risk.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.thejoyofcode.com/uploads/multibinding_source.zip"&gt;Download Source (12 KB)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;Please leave some feedback in the comments if you like it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Important Notes&lt;/h3&gt;

You may have noticed a few strange features about our MultiBinding, e.g. how the inputs are specified on a number of Input1, Input2 and Input3 properties instead of on child controls. That's just the way it is I'm afraid (because Bindings only work on members of the visual tree, and since this is a non-visual element any child elements aren't part of the visual tree), and because of this you have to specify the NumberOfInputs you want - my version supports up to 5.

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;binding:MultiBinding&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="mb"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Converter&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{StaticResource intsToBrushConverter}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;NumberOfInputs&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="3"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Input1&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=red, Path=Value, Mode=TwoWay}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Input2&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=green, Path=Value, Mode=TwoWay}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Input3&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=blue, Path=Value, Mode=TwoWay}"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

You really can drop this control pretty much anywhere in your visual tree but it makes most sense to keep it close to the parts that need it. As always, your own mileage may vary. Any feedback appreciated in the comments.
        &lt;img src="http://www.thejoyofcode.com/feed.gif?MultiBinding for Silverlight 3" width="1" height="1" alt="" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=sVrLQwdJhNQ:XjRi48kdEqA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=sVrLQwdJhNQ:XjRi48kdEqA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Wed, 23 Sep 2009 10:27:55 GMT</pubDate><dc:date>2009-09-23T10:27:55.653Z</dc:date><guid isPermaLink="true">http://www.thejoyofcode.com/MultiBinding_for_Silverlight_3.aspx</guid><dc:creator>Josh Twist</dc:creator><category>MVVM</category><category>Silverlight</category><slash:comments>4</slash:comments><comments>http://www.thejoyofcode.com/MultiBinding_for_Silverlight_3.aspx#comments</comments><wfw:commentRss>http://www.thejoyofcode.com/Feed.ashx?feed=%2FComments%2FRSS_2-0&amp;PostId=8d4ec702-30a3-4435-81a1-e6d368a5872a</wfw:commentRss></item><item><title>.NET Naming Conventions</title><link>http://www.thejoyofcode.com/_NET_Naming_Conventions.aspx</link><description>I often get asked about the Naming Conventions I adhere to when writing code (C#, naturally).&lt;p /&gt;It made sense to share these in a blog post so I can refer to it in future. &lt;p /&gt;Some of these guidelines (well, one, the underscore on private fields) are negotiable as a matter of style. However, the public stuff is non-negotiable. For this is how .NET APIs should be and failure to adhere to this reflects badly on your code. No, no, no.&lt;p /&gt;I thought a good way to present this would be an example class demonstrating the rules and some comments to help, so here goes:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// Namespaces are PascalCased&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;namespace&lt;/span&gt; TheJoyOfCode.NamingConventions&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// Class names are PascalCased&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;class&lt;/span&gt; ExampleClass&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// All public fields, including constants are PascalCased&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;static&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;const&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt; PiAsAString &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; &lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"3.14"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// All private fields are camelCased with an underscore [1]&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;readonly&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt; _privateMember;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// All protected members are PascalCased&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;protected&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;int&lt;/span&gt; ProtectedField &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; 12;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// All internal members are PascalCased&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;internal&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;int&lt;/span&gt; InternalField &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; 13;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// All private methods are PascalCased&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// *** NOTE - All parameters are camelCased&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt; Multiply(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt; valueA, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt; valueB)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// local variables (scoped within a method) are camelCased (no underscore)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt; result &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; valueA &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;*&lt;/span&gt; valueB;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; result;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// All private Properties are PascalCased&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// *** NOTE - Acronyms of 2 characters are UPPERCASED (e.g. UI, IO)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt; UIElementName { get; } &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// All (public and private) properties are PascalCased&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// *** NOTE - Acronyms longer than 2 characters are PascalCased (e.g. Html, Xml)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;int&lt;/span&gt; HtmlLength { get; set; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// All public methods are PascalCased&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// *** NOTE - All parameters are camelCased&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// *** NOTE - Abbreviations are not treated as Acronyms (so _Id_entification is Id, not ID).&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; AlignObjectById(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt; id, Alignment alignment)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;throw&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; NotImplementedException();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// Nested classes are PascalCased, even Private ones&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;class&lt;/span&gt; NestedClass : IDisposable&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; Dispose()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;throw&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; NotImplementedException();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// Enums are PascalCased and not plural (unless marked [Flags] in which case the name should be plural)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;enum&lt;/span&gt; Alignment&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// Enum members are PascalCased&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Top,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Bottom,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Left,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Right,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// [1] - Note the underscore isn't as recommended by StyleCop but since it applies only to private members, can be considered a matter of style and one that I personally use.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

... and as for &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;#region&lt;/span&gt;&lt;/span&gt; blocks &lt;a href="http://www.codinghorror.com/blog/archives/001147.html"&gt;I do not use regions and I don't negotiate with terrorists&lt;/a&gt; either.
        &lt;img src="http://www.thejoyofcode.com/feed.gif?.NET Naming Conventions" width="1" height="1" alt="" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=G3vKwLUuKG4:hGJLdHR3-lE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=G3vKwLUuKG4:hGJLdHR3-lE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Tue, 08 Sep 2009 09:26:35 GMT</pubDate><dc:date>2009-09-08T09:26:35.66Z</dc:date><guid isPermaLink="true">http://www.thejoyofcode.com/_NET_Naming_Conventions.aspx</guid><dc:creator>Josh Twist</dc:creator><category>C#</category><slash:comments>11</slash:comments><comments>http://www.thejoyofcode.com/_NET_Naming_Conventions.aspx#comments</comments><wfw:commentRss>http://www.thejoyofcode.com/Feed.ashx?feed=%2FComments%2FRSS_2-0&amp;PostId=8c4dfea0-d3a5-4570-b4f4-a0d19aa951c2</wfw:commentRss></item><item><title>A Suck Less Event Aggregator for Prism?</title><link>http://www.thejoyofcode.com/A_Suck_Less_Event_Aggregator_for_Prism.aspx</link><description>I heard on twitter the other day (Yes, I now tweet occasionally. If you'd like to waste literally seconds of your day you can follow me at &lt;a href="http://www.twitter.com/joshtwist"&gt;joshtwist&lt;/a&gt;) that some folks at an Alt.Net UK event where giving P&amp;amp;P and Prism a rough ride. Specifically, they had some issues with the EventAggregator - citing Jeremy Miller's criticisms in this post &lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2009/07/21/braindump-on-the-event-aggregator-pattern.aspx"&gt;Braindump on the Event Aggregator Pattern&lt;/a&gt;.&lt;p /&gt;I need to say up front that I really like the EventAggregator in Prism - it's one of my favourite bits. However, I have to agree with some of the feedback. I've always found it odd that I have to go to the EventAggregator and ask for an 'event' object. Especially because the thing I get back isn't an event, but the 'bus' through which events travel.

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;CustomerSelectedEvent cse &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; eventAggregator.GetEvent&amp;lt;CustomerSelectedEvent&amp;gt;();&lt;br /&gt;cse.Subscribe(c =&amp;gt; CustomerHasBeenSelected(c));&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// meanwhile, elsewhere...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;CustomerSelectedEvent cse &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; eventAggregator.GetEvent&amp;lt;CustomerSelectedEvent&amp;gt;();&lt;br /&gt;cse.Publish(customer);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

However, once I've learned the API I've never found it obstructive. Nonetheless - I wondered, how hard would it be to create a wrapper that makes the Event Aggregator look something like you might expect it to look?

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;interface&lt;/span&gt; ISuckLessEventAggregator&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; SendMessage&amp;lt;T&amp;gt;(T message);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; Subscribe&amp;lt;T&amp;gt;(Action&amp;lt;T&amp;gt; action);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; Subscribe&amp;lt;T&amp;gt;(Action&amp;lt;T&amp;gt; action, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;bool&lt;/span&gt; keepSubscriberReferenceAlive);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; Subscribe&amp;lt;T&amp;gt;(Action&amp;lt;T&amp;gt; action, Microsoft.Practices.Composite.Presentation.Events.ThreadOption threadOption, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;bool&lt;/span&gt; keepSubscriberReferenceAlive, Predicate&amp;lt;T&amp;gt; where);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; Unsubscribe&amp;lt;T&amp;gt;(Action&amp;lt;T&amp;gt; action);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

The interface would look something like that I guess. And it would be used like so.

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;eventAggregator.Subscribe&amp;lt;Customer&amp;gt;(c =&amp;gt; CustomerHasBeenSelected(c));&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// meanwhile, elsewhere...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;eventAggregator.Send(customer);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

That certainly feels a bit better. However, there's no 'topic' described so this feels like a poor usage of the new interface as I can't distinguish Customer *selection* from other events involving the Customer type. Maybe this is better:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;class&lt;/span&gt; CustomerSelectedEvent&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; Customer Customer { get; set; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// elsewhere&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;eventAggregator.Subscribe&amp;lt;CustomerSelectedEvent&amp;gt;(c =&amp;gt; CustomerHasBeenSelected(c.Customer));&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// meanwhile, elsewhere...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;eventAggregator.Send(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; CustomerSelectedEvent { Customer &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; customer} );&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

Now I prefer this over the existing pattern for a number of reasons

&lt;ol&gt;
	&lt;li&gt;It's just easier to read&lt;/li&gt;
	&lt;li&gt;The 'event' class, CustomerSelectedEvent, is a POCO - no dependencies on the Prism pieces.&lt;/li&gt;
&lt;/ol&gt;
	
And how might this implementation look? Here's a first shot:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;using&lt;/span&gt; Microsoft.Practices.Composite.Events;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;using&lt;/span&gt; Microsoft.Practices.Composite.Presentation.Events;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;class&lt;/span&gt; SuckLessEventAggregator : ISuckLessEventAggregator&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;readonly&lt;/span&gt; IEventAggregator _eventAggregator;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; SuckLessEventAggregator(IEventAggregator eventAggregator)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_eventAggregator &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; eventAggregator;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; CompositePresentationEvent&amp;lt;T&amp;gt; GetEventBus&amp;lt;T&amp;gt;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var bus &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; _eventAggregator.GetEvent&amp;lt;CompositePresentationEvent&amp;lt;T&amp;gt;&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; bus;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; SendMessage&amp;lt;T&amp;gt;(T message)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var bus &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; GetEventBus&amp;lt;T&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bus.Publish(message);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; Subscribe&amp;lt;T&amp;gt;(Action&amp;lt;T&amp;gt; action)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var bus &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; GetEventBus&amp;lt;T&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bus.Subscribe(action);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; Subscribe&amp;lt;T&amp;gt;(Action&amp;lt;T&amp;gt; action, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;bool&lt;/span&gt; keepSubscriberReferenceAlive)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var bus &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; GetEventBus&amp;lt;T&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bus.Subscribe(action, keepSubscriberReferenceAlive);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; Subscribe&amp;lt;T&amp;gt;(Action&amp;lt;T&amp;gt; action, ThreadOption threadOption, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;bool&lt;/span&gt; keepSubscriberReferenceAlive, Predicate&amp;lt;T&amp;gt; where)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var bus &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; GetEventBus&amp;lt;T&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bus.Subscribe(action, threadOption, keepSubscriberReferenceAlive, where);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; Unusbscribe&amp;lt;T&amp;gt;(Action&amp;lt;T&amp;gt; action)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var bus &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; GetEventBus&amp;lt;T&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bus.Unsubscribe(action);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// You'd probably have more overloads but I'll wait for C# 4's Optional keyword :) &lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

Does this feel better? &lt;p /&gt;I realise that it doesn't address all of Jeremy's concerns (it's just the result of a short train journey's work so far). However, some of them I just don't agree with.&lt;p /&gt;For example:

&lt;p class="quote"&gt;"2. The listeners should have little or preferably NO/ZILCH/NADA coupling to the event aggregator."&lt;/p&gt;

I'd much prefer an explicit dependency on the EventAggregator than a relatively implicit one to an IoC behavior. In either case, this is more of a religious argument than a technical one.&lt;p /&gt;I also realise that most of this could have been implemented in Extension Methods but I think a separate, uncluttered API would be more intuitive.&lt;p /&gt;Thoughts? Any holes in my quick implementation?&lt;p /&gt;

        &lt;img src="http://www.thejoyofcode.com/feed.gif?A Suck Less Event Aggregator for Prism?" width="1" height="1" alt="" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=sUt5XYeEwi0:Vrtff2UeOA4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=sUt5XYeEwi0:Vrtff2UeOA4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Tue, 04 Aug 2009 01:27:37 GMT</pubDate><dc:date>2009-08-04T01:27:37.577Z</dc:date><guid isPermaLink="true">http://www.thejoyofcode.com/A_Suck_Less_Event_Aggregator_for_Prism.aspx</guid><dc:creator>Josh Twist</dc:creator><category>WPF</category><category>Silverlight</category><category>Prism</category><slash:comments>4</slash:comments><comments>http://www.thejoyofcode.com/A_Suck_Less_Event_Aggregator_for_Prism.aspx#comments</comments><wfw:commentRss>http://www.thejoyofcode.com/Feed.ashx?feed=%2FComments%2FRSS_2-0&amp;PostId=b8666f01-22ee-4a19-8428-396cbaa7b913</wfw:commentRss></item><item><title>How to work with PropertyChanged's smelly name string</title><link>http://www.thejoyofcode.com/How_to_work_with_PropertyChanged_s_smelly_name_string.aspx</link><description>Karl posted an interesting article recently &lt;a href="http://karlshifflett.wordpress.com/2009/08/01/inotifypropertychanged-how-to-remove-the-property-name-string-code-smell/"&gt;INotifyPropertyChanged – How to remove the Property Name String Code Smell&lt;/a&gt;.&lt;p /&gt;It'a nice implementation and the resulting code certainly looks a whole better. As Karl notes the biggest problem this approach faces is one with performance. &lt;p /&gt;Notably, the proposed implementation is a lot slower when there are listeners wired up to the INotifyPropertyChanged plumbing.&lt;p /&gt;The performance could be improved by caching the StackTrace based on an accompanying static key for each property, e.g. 

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;static&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;readonly&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt; _namePropertyKey &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt;();&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt; Name&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; _name; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_name &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OnPropertyChanged(_namePropertyKey);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

However, this is probably just as prone to runtime errors in case somebody uses the wrong key with the wrong property.&lt;p /&gt;With respect to the importance of performance then Karl is right to note that your users can only type so fast. But in some models and viewmodels, say containing a few hundred points that will be represented on a chart. That hit in performance could REALLY hurt.&lt;p /&gt;My approach to this problem is to leave the smelly string where it is and automate the testing process using the &lt;a href="http://classtester.codeplex.com/"&gt;Automatic Class Tester&lt;/a&gt;. This will automaticaly test that your properties are wired up appropriately and, if your class implements INotifyPropertyChanged it will also check that the appropriate PropertyChanged string name is fired.
        &lt;img src="http://www.thejoyofcode.com/feed.gif?How to work with PropertyChanged's smelly name string" width="1" height="1" alt="" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=GWuAt4Th198:dMiASmEtZZo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=GWuAt4Th198:dMiASmEtZZo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Sun, 02 Aug 2009 10:52:35 GMT</pubDate><dc:date>2009-08-02T10:52:35.217Z</dc:date><guid isPermaLink="true">http://www.thejoyofcode.com/How_to_work_with_PropertyChanged_s_smelly_name_string.aspx</guid><dc:creator>Josh Twist</dc:creator><category>MVVM</category><category>WPF</category><category>Silverlight</category><slash:comments>2</slash:comments><comments>http://www.thejoyofcode.com/How_to_work_with_PropertyChanged_s_smelly_name_string.aspx#comments</comments><wfw:commentRss>http://www.thejoyofcode.com/Feed.ashx?feed=%2FComments%2FRSS_2-0&amp;PostId=c50cc0ad-3ed1-4f44-aa54-bf2e1655bb86</wfw:commentRss></item><item><title>Silverlight, Validation and MVVM - Part II</title><link>http://www.thejoyofcode.com/Silverlight_Validation_and_MVVM_Part_II.aspx</link><description>The new Validation states for controls in Silverlight 3 sure look nice but there are a number of limitations. For starters, you can only invoke them through:

&lt;ul&gt;
	&lt;li&gt;An exception thrown by a bound property setter&lt;/li&gt;
	&lt;li&gt;An exception thrown by a ValueConverter&lt;/li&gt;
&lt;/ul&gt;

The latter feels particularly unsavoury as you'll need to reuse the same converter wherever you want to bind to that property - a big violation of the DRY principle.&lt;p /&gt;You can't even use the new ValidationAttributes from System.ComponentModel.DataAnnotations. Well, actually you can but you'd have to this inside the setter:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;[Range(18, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;int&lt;/span&gt;.MaxValue, ErrorMessage=&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"Must be 18 or over"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;int&lt;/span&gt; Age&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; _age; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Validator.ValidateProperty(value, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; ValidationContext(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;this&lt;/span&gt;, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;null&lt;/span&gt;, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;null&lt;/span&gt;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MemberName &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; &lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"Age"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_age &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OnPropertyChanged(&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"Age"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

(You can imagine an enhancement to this pattern using the SetValue concept I shared with my &lt;a href="http://www.thejoyofcode.com/New_snippets_for_Silverlight_and_WPF.aspx"&gt;new snippets&lt;/a&gt; the other day).&lt;p /&gt;What's particularly tricky is to display the invalid state if the value is never changed by the user. For example, you have a name field that is required:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;[Reguired(ErrorMessage=&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"Name is required"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt; Name&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

This is bound to a TextBox:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;TextBox&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Text&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding Name, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="NameTextBox"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Button&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Content&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Save"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="SaveButton"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

The problem is, the user might click save without ever entering the a name. Oh no!&lt;p /&gt;Sure, we can catch that in our code (using the Validator type again, for example). However, there's no easy way of forcing the control to display the error. The only way to achieve this is to force the binding to update programmatically, like so:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;BindingExpression binding &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; NameTextBox.GetBindingExpression(TextBox.TextProperty);&lt;br /&gt;binding.UpdateSource();&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

Now, to get this working on any scale is going to require code-behind. Lots of code-behind. And everybody knows I hate this. The whole validation story at the moment isn't going to play at all well with Model-View-ViewModel (MVVM).&lt;p /&gt;What we need is an easy way to Update all bindings from our ViewModel...&lt;p /&gt;And so, I set about finding a more declarative way of achieving solving. My approach builds on my previous post &lt;a href="http://www.thejoyofcode.com/Silverlight_Validation_and_ViewModel.aspx"&gt;Silverlight Validation and ViewModel&lt;/a&gt;.

&lt;h3&gt;Re-introducing the ValidationScope&lt;/h3&gt;

In this update - the ValidationScope class becomes much more important and has more to offer than just an attached properties/behavior.&lt;p /&gt;It now becomes an integral part of your ViewModel. Let's walk through a scenario. Here we'll have a ViewModel that exposes a Person property of type Person:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// properties snipped down for brevity&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;class&lt;/span&gt; Person&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Required(ErrorMessage= &lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"Name is required"&lt;/span&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt; Name {}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Required(ErrorMessage &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; &lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"Salutation is required"&lt;/span&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt; Salutation {}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Range(0, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;int&lt;/span&gt;.MaxValue, ErrorMessage &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; &lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"Must be over 18"&lt;/span&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;int&lt;/span&gt; Age {}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

Nice and easy. Now the validation scope comes into play - we add an instance to our ViewModel because we'll access it via binding. To be honest, this could go almost anywhere you like provided it's accessible in a Binding (resources, in the Person class itself, anywhere you like!).

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// properties snipped down for brevity&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;class&lt;/span&gt; MainViewModel : INotifyPropertyChanged&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; ObservableCollection&amp;lt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt;&amp;gt; Salutations {}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; Person Person {}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; ValidationScope PersonValidationScope {}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

So there's our model and our ViewModel. Now for some view - our Xaml (again, simplified for brevity):

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;StackPanel local:ValidationScope.ValidationScope="{Binding PersonValidationScope}"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;TextBox&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Text&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding Person.Name, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;local:ValidationScope.ValidateBoundProperty="Text" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;TextBox&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Text&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding Person.Age, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;local:ValidationScope.ValidateBoundProperty="Text" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;ComboBox&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;ItemsSource&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding Salutations}"&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;SelectedItem&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding Person.Salutation, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnExceptions=True}"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;/span&gt;&lt;br /&gt;        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;local:ValidationScope.ValidateBoundProperty="SelectedItem" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Button&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Content&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Save"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Click&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="SaveButtonClick"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;StackPanel&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

And the code-behind:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;//Note - I'd normally use Prism's DelegateCommand and commanding support to avoid this code-behind but don't want to muddy the example&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; SaveButtonClick(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&lt;br /&gt;{&lt;br /&gt;    _personViewModel.Save();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

Finally, the Save method on the ViewModel

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; Save()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// This causes all registered bindings to be updated&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PersonValidationScope.ValidateScope();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;if&lt;/span&gt; (PersonValidationScope.IsValid())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// Save changes!&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

&lt;h3&gt;How it all works&lt;/h3&gt;

Whilst getting here took me a whole morning of confusion - it's actually quite straightforward.&lt;p /&gt;First, we use an attached behavior to pass the FrameworkElement we want to be the conceptual 'validation scope' within the VisualTree to our actual ValidationScope instance:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;StackPanel local:ValidationScope.ValidationScope="{Binding PersonValidationScope}"&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

Then we specify the property who is bound and might need a refresh &lt;strong&gt;for each control&lt;/strong&gt;:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;TextBox local:ValidationScope.ValidateBoundProperty="Text" /&amp;gt;&lt;br /&gt;&amp;lt;ComboBox local:ValidationScope.ValidateBoundProperty="SelectedItem" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;
	
Sadly, this is really a violation of the DRY principle anyway but it does have the added advantage of having to opt in your Bindings to the ValidationScope.
Finally, when we're ready, we tell the ValidationScope to update all the bindings:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;PersonValidationScope.ValidateScope();&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

This kicks the process into action with a crawl of the VisualTree inside the FrameworkElement registered as our scope (the StackPanel in this case) and hunts out any attached ValidateBoundProperty properties wired to controls. When it finds them it looks for the appropriate DependencyProperty (Text and SelectedItem in our demo)

&lt;h3&gt;demoware&lt;/h3&gt;

If you're interested in this you'll want to see a working demo and the source code. Here's the former and the latter will follow in a minute. To bush the barrier, we actually have &lt;strong&gt;two validation scopes in the same view, side-by-side&lt;/strong&gt;

&lt;script type="text/javascript" src="http://www.thejoyofcode.com/Silverlight.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
function createSilverlight_silverlightValidationFx()
{
Silverlight.createObjectEx({
source: "http://www.thejoyofcode.com/uploads/createSilverlight_silverlightValidationFx.xap",
parentElement: document.getElementById("createSilverlight_silverlightValidationFx"),
id: "SilverlightControl",
properties: {
width: "475px",
height: "450px",
version: "3.0",
enableHtmlAccess: "true"
},
events: {
onError: null,
onLoad: null
}});
}
&lt;/script&gt;

&lt;p&gt;
&lt;div id="createSilverlight_silverlightValidationFx"&gt;
&lt;script type="text/javascript"&gt;
createSilverlight_silverlightValidationFx();
&lt;/script&gt;
&lt;/div&gt;
&lt;/p&gt;

Before you get to the source - bear in mind this is demoware/spike standard only and probably needs work. The usual disclaimers apply. Here are just some thing that haven't even been thought about in the current implementation:

&lt;ul&gt;
	&lt;li&gt;binding to the same ValidationScope from two different FrameworkElements&lt;/li&gt;
	&lt;li&gt;performance could be improved, quite a bit of reflection&lt;/li&gt;
	&lt;li&gt;nested ValidationScopes&lt;/li&gt;
	&lt;li&gt;many more I'm sure&lt;/li&gt;
&lt;/ul&gt;

Finally, before you rush off make sure to double check that the new &lt;strong&gt;DataForm&lt;/strong&gt; control and/or &lt;strong&gt;.NET RIA Services&lt;/strong&gt; isn't really what you need to solve your validation requirements. 
		
&lt;h3&gt;The source&lt;/h3&gt;

Get it here and remember, this may damage your health and your house is at risk if you use it as it is: &lt;strong&gt;&lt;a href="http://www.thejoyofcode.com/uploads/silverlightValidationFx.zip"&gt;Download Source (15 KB)&lt;/a&gt;&lt;/strong&gt;

&lt;h3&gt;Feedback&lt;/h3&gt;

Please let me know what you think of this approach, if you go on to use it and, if so, what changes you made. Also, let me know if you have any suggestions or questions - either via the comments below or via e-mail through the &lt;a href="http://www.thejoyofcode.com/Contact_us.aspx"&gt;contact us&lt;/a&gt; page.
        &lt;img src="http://www.thejoyofcode.com/feed.gif?Silverlight, Validation and MVVM - Part II" width="1" height="1" alt="" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=OveF8_Z5m_Q:yuInoG5pgZA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=OveF8_Z5m_Q:yuInoG5pgZA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Fri, 31 Jul 2009 07:51:40 GMT</pubDate><dc:date>2009-07-31T07:51:40.92Z</dc:date><guid isPermaLink="true">http://www.thejoyofcode.com/Silverlight_Validation_and_MVVM_Part_II.aspx</guid><dc:creator>Josh Twist</dc:creator><category>MVVM</category><category>Silverlight</category><slash:comments>9</slash:comments><comments>http://www.thejoyofcode.com/Silverlight_Validation_and_MVVM_Part_II.aspx#comments</comments><wfw:commentRss>http://www.thejoyofcode.com/Feed.ashx?feed=%2FComments%2FRSS_2-0&amp;PostId=c361a91e-04b5-4b92-9677-ec244a06fb93</wfw:commentRss></item><item><title>New snippets for Silverlight and WPF</title><link>http://www.thejoyofcode.com/New_snippets_for_Silverlight_and_WPF.aspx</link><description>A while back I posted some snippets for WPF here: &lt;a href="http://www.thejoyofcode.com/WPF_Snippets_for_Visual_Studio.aspx"&gt;WPF Snippets for Visual Studio&lt;/a&gt;. I've been wanting to update these for a while now and finally got around to it this morning. Here are the new snippets.

&lt;h3&gt;basevm&lt;/h3&gt;

This is a snippet that effectively replaces the &lt;strong&gt;inpc&lt;/strong&gt; snippet (although that is still included for demos etc). The primary addition is that of a SetValue method that actually checks if values have been changed before raising the PropertyChanged event. Here's what the snippet looks like.

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// TODO - consider making this class abstract if it is used as a base class&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;class&lt;/span&gt; ViewModelBase : INotifyPropertyChanged&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;event&lt;/span&gt; PropertyChangedEventHandler PropertyChanged;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;protected&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;virtual&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; OnPropertyChanged(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt; propertyName)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PropertyChangedEventHandler pceh &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; PropertyChanged;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;if&lt;/span&gt; (pceh !&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pceh(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;this&lt;/span&gt;, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; PropertyChangedEventArgs(propertyName));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/// Set's the value of the target parameter (replacing the reference) if the value has changed. Also fires&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/// a PropertyChanged event if the value has changed.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/// &amp;lt;typeparam name="T"&amp;gt;The type of the property&amp;lt;/typeparam&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/// &amp;lt;param name="target"&amp;gt;The target to be swapped out, if different to the value parameter&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/// &amp;lt;param name="value"&amp;gt;The new value&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/// &amp;lt;param name="changedProperties"&amp;gt;A list of properties whose value may have been impacted by this change and whose PropertyChanged event should be raised&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/// &amp;lt;returns&amp;gt;True if the value is changed, False otherwise&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;protected&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;virtual&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;bool&lt;/span&gt; SetValue&amp;lt;T&amp;gt;(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;ref&lt;/span&gt; T target, T value, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;params&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt;[] changedProperties)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;if&lt;/span&gt; (Object.Equals(target, value))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;target &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; value;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;foreach&lt;/span&gt; (&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt; property &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;in&lt;/span&gt; changedProperties)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OnPropertyChanged(property);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

Note that it's also hinting that this would make a good base class for your ViewModel classes - but that's up to you.

&lt;h3&gt;propsv&lt;/h3&gt;

This is the accompanying replacement for basevm - trumping &lt;strong&gt;propnp&lt;/strong&gt; (although again, that is included for &lt;strong&gt;inpc&lt;/strong&gt; users).

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;int&lt;/span&gt; _age;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;int&lt;/span&gt; Age&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; _age; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetValue(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;ref&lt;/span&gt; _age, value, &lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"Age"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

SetValue takes a list of strings specifying what PropertyChanged events should fire. This is because you often want to fire Changes for dependant properties. E.g.

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;bool&lt;/span&gt; IsLegalDrinkingAgeInUK&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; _age &amp;gt; 18; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;int&lt;/span&gt; _age;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;int&lt;/span&gt; Age&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; _age; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetValue(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;ref&lt;/span&gt; _age, value, &lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"Age"&lt;/span&gt;, &lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"IsLegalDrinkingAgeInUK"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

SetValue also returns a bool in case you want to do some conditional processing based on whether the value was actually changed or not, e.g.:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;int&lt;/span&gt; Age&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; _age; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;if&lt;/span&gt; (SetValue(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;ref&lt;/span&gt; _age, value, &lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"Age"&lt;/span&gt;, &lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"IsLegalDrinkingAgeInUK"&lt;/span&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DoSomethingWhenAgeChanges();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

&lt;h3&gt;depprop&lt;/h3&gt;

Finally, I've really been wanting to add this to my snippets. Basically some enhancements to the built-in &lt;strong&gt;propdp&lt;/strong&gt; with these new features:

&lt;ul&gt;
	&lt;li&gt;Adds a Change handler for the dependency property&lt;/li&gt;
	&lt;li&gt;This one favours Silverlight by going for PropertyMetadata, instead of UIPropertyMetadata (WPF users just put the 'UI' back in)&lt;/li&gt;
	&lt;li&gt;Sets the default value of the dependency property using the &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;default&lt;/span&gt;(type)&lt;/span&gt; syntax - should avoid nasty errors when you leave '0' instead of '0d' for a double,e tc.&lt;/li&gt;
&lt;/ul&gt;

Here's how it looks:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt; Minimum&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; (&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt;)GetValue(MinimumProperty); }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set { SetValue(MinimumProperty, value); }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;static&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;readonly&lt;/span&gt; DependencyProperty MinimumProperty &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DependencyProperty.Register(&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"Minimum"&lt;/span&gt;, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;typeof&lt;/span&gt;(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt;), &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;typeof&lt;/span&gt;(MyDependencyObject), &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; PropertyMetadata(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;default&lt;/span&gt;(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt;), MinimumChanged));&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;static&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; MinimumChanged(DependencyObject source, DependencyPropertyChangedEventArgs args)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MyDependencyObject instance &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; (MyDependencyObject)source;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// TODO - implement change handling here&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

&lt;h3&gt;Download&lt;/h3&gt;

Enjoy: &lt;strong&gt;&lt;a href="http://www.thejoyofcode.com/uploads/Snippets.zip"&gt;Download Snippets.zip (5KB)&lt;/a&gt;&lt;/strong&gt;.&lt;p /&gt;For installation instructions see here: &lt;a href="http://www.thejoyofcode.com/WPF_Snippets_for_Visual_Studio.aspx"&gt;WPF Snippets for Visual Studio&lt;/a&gt;.&lt;p /&gt;If you have any other suggestions for snippets you'd like to see, please leave a comment.
        &lt;img src="http://www.thejoyofcode.com/feed.gif?New snippets for Silverlight and WPF" width="1" height="1" alt="" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=lv6BXUl6sxI:XykzyHntfYo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=lv6BXUl6sxI:XykzyHntfYo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Thu, 30 Jul 2009 01:44:41 GMT</pubDate><dc:date>2009-07-30T01:44:41.453Z</dc:date><guid isPermaLink="true">http://www.thejoyofcode.com/New_snippets_for_Silverlight_and_WPF.aspx</guid><dc:creator>Josh Twist</dc:creator><category>WPF</category><category>Silverlight</category><category>Snippets</category><category>Visual Studio</category><slash:comments>1</slash:comments><comments>http://www.thejoyofcode.com/New_snippets_for_Silverlight_and_WPF.aspx#comments</comments><wfw:commentRss>http://www.thejoyofcode.com/Feed.ashx?feed=%2FComments%2FRSS_2-0&amp;PostId=d04562f1-492a-40ad-94d3-39156a4fd938</wfw:commentRss></item><item><title>Bindorama - Binding Craziness now for Silverlight too!</title><link>http://www.thejoyofcode.com/Bindorama_Binding_Craziness_now_for_Silverlight_too.aspx</link><description>A while back I posted &lt;a href="http://www.thejoyofcode.com/And_now_for_something_completely_crazy_Binding_without_WPF.aspx"&gt;And now for something completely crazy: Binding without WPF&lt;/a&gt; where I proposed a class that would allow you to use WPF's awesome binding deep inside your own code away from any visuals - awesome stuff for some complex ViewModel scenarios.&lt;p /&gt;I unimaginatively entitled the class &lt;strong&gt;BindingObject&lt;/strong&gt; but here's the Silverlight version and I've decided to name him: &lt;strong&gt;Bindorama&lt;/strong&gt;!&lt;p /&gt;Here's the code:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;class&lt;/span&gt; Bindorama : FrameworkElement, IDisposable&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;bool&lt;/span&gt; _suppress;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; Action&amp;lt;DependencyPropertyChangedEventArgs&amp;gt; _onChanged;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; Bindorama(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt; source, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt; bindingPath, Action&amp;lt;DependencyPropertyChangedEventArgs&amp;gt; onChanged)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;using&lt;/span&gt; (SuppressNotifications())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_onChanged &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; onChanged;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Binding binding &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; Binding(bindingPath);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;binding.Source &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; source;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BindingOperations.SetBinding(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;this&lt;/span&gt;, ValueProperty, binding);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt; Value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; (&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt;)GetValue(ValueProperty); }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set { SetValue(ValueProperty, value); }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;static&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;readonly&lt;/span&gt; DependencyProperty ValueProperty &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DependencyProperty.Register(&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"Value"&lt;/span&gt;, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;typeof&lt;/span&gt;(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt;), &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;typeof&lt;/span&gt;(Bindorama), &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; PropertyMetadata(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;null&lt;/span&gt;, ValueChangedCallback));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;static&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; ValueChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var instance &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; (Bindorama)d;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Action&amp;lt;DependencyPropertyChangedEventArgs&amp;gt; onChanged &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; instance._onChanged;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;if&lt;/span&gt; (onChanged !&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; !instance._suppress)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;onChanged(e);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; Dispose()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BindingOperations.SetBinding(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;this&lt;/span&gt;, ValueProperty, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;null&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_onChanged &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; IDisposable SuppressNotifications()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; Supresser(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;this&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;class&lt;/span&gt; Supresser : IDisposable&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; Bindorama _bindingObject;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; Supresser(Bindorama bindingObject)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_bindingObject &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; bindingObject;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_bindingObject._suppress &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; Dispose()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_bindingObject._suppress &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

What are the advantages of this over just subscribing to INotifyPropertyChanged?

&lt;ul&gt;
	&lt;li&gt;Weak reference based - no more leaking memory.&lt;/li&gt;
	&lt;li&gt;Can go deep on properties: "Property.That.I.Want.To.Monitor" - this is hard to do well manually&lt;/li&gt;
	&lt;li&gt;Can use indexers: "Collection[0]"&lt;/li&gt;
&lt;/ul&gt;

And here's how you use him:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;Bindorama b &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; Bindorama(objectYouWantToMonitor, &lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"Property.You.Want.To.Monitor"&lt;/span&gt;, DelegateToFireOnChange);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; DelegateToFireOnChange(DependencyPropertyChangedEventArgs args)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBox.Show(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt;.Format(&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"NewValue: {0}, OldValue: {1}"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;args.NewValue,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;args.OldValue);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

Awesome!&lt;p /&gt;Note, if the instance of Bindorama gets garbage collected then the event will stop firing (obviously). So you may need to keep a reference to it to keep it alive. Of course, this has huge advantages to help prevent memory leaks that so often occur when we start registering for events.&lt;p /&gt;If you need to deterministically stop the events firing, then dispose the Bindorama (b.Dispose()). It's IDisposable so you can use it inside a using block if necessary.&lt;p /&gt;Finally, I thought some extension methods might make this easier to use:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;static&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;class&lt;/span&gt; BindoramaExtensions&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;static&lt;/span&gt; IDisposable Watch(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;this&lt;/span&gt; INotifyPropertyChanged source, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt; propertyExpression, Action&amp;lt;DependencyPropertyChangedEventArgs&amp;gt; onChanged)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; CoreWatch(source, propertyExpression, onChanged);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;static&lt;/span&gt; IDisposable Watch(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;this&lt;/span&gt; DependencyObject source, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt; propertyExpression, Action&amp;lt;DependencyPropertyChangedEventArgs&amp;gt; onChanged)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; CoreWatch(source, propertyExpression, onChanged);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;static&lt;/span&gt; IDisposable CoreWatch(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt; source, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;string&lt;/span&gt; propertyExpression, Action&amp;lt;DependencyPropertyChangedEventArgs&amp;gt; onChanged)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; Bindorama(source, propertyExpression, onChanged);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

Which means you can now simply 'Watch' any INotifyPropertyChanged instance of DependencyObject easy peasy:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;objectYouWantToMonitor.Watch(&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"Property.You.Want.To.Monitor"&lt;/span&gt;, args =&amp;gt; MessageBox.Show(args.NewValue.ToString()));&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

Note that this returns IDisposable and he'll need to remain rooted if you want to receive change notifications (or dispose him to stop listening).
        &lt;img src="http://www.thejoyofcode.com/feed.gif?Bindorama - Binding Craziness now for Silverlight too!" width="1" height="1" alt="" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=nS5CtzrM8aM:qGDCTNRJPK4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=nS5CtzrM8aM:qGDCTNRJPK4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Tue, 28 Jul 2009 00:21:17 GMT</pubDate><dc:date>2009-07-28T00:21:17.563Z</dc:date><guid isPermaLink="true">http://www.thejoyofcode.com/Bindorama_Binding_Craziness_now_for_Silverlight_too.aspx</guid><dc:creator>Josh Twist</dc:creator><category>MVVM</category><category>WPF</category><category>Silverlight</category><slash:comments>1</slash:comments><comments>http://www.thejoyofcode.com/Bindorama_Binding_Craziness_now_for_Silverlight_too.aspx#comments</comments><wfw:commentRss>http://www.thejoyofcode.com/Feed.ashx?feed=%2FComments%2FRSS_2-0&amp;PostId=c78af6f4-8bd1-4e2f-82d0-3962ed32ec3e</wfw:commentRss></item><item><title>Creating a Range Slider in Silverlight (and some of the binding gotchas in SL3)</title><link>http://www.thejoyofcode.com/Creating_a_Range_Slider_in_Silverlight_and_some_of_the_binding_gotchas_in_SL3_.aspx</link><description>Yesterday, I posted about how to &lt;a href="http://www.thejoyofcode.com/Creating_a_Range_Slider_in_WPF_and_other_cool_tips_and_tricks_for_UserControls_.aspx"&gt;Create a Range Slider in WPF&lt;/a&gt; using composition within a UserControl.&lt;p /&gt;Today, I want to do the same in Silverlight and &lt;em&gt;_try_&lt;/em&gt; to use the same technique(s).&lt;p /&gt;The obvious things that need to change are:

&lt;ol&gt;
	&lt;li&gt;The Slider ControlTemplate&lt;/li&gt;
	&lt;li&gt;Removing the ElementName binding&lt;/li&gt;
&lt;/ol&gt;

I can hear you all now: "No! Josh! Silverlight 3 has ElementName binding support! You don't need to remove it! Nooooo!".&lt;p /&gt;Sadly though, we can't use it the way I did in &lt;a href="http://www.thejoyofcode.com/Creating_a_Range_Slider_in_WPF_and_other_cool_tips_and_tricks_for_UserControls_.aspx"&gt;yesterday's post&lt;/a&gt;. Let's recap the big tip I was using:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;UserControl&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Class&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="UserControlFun.RangeSlider"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;xmlns&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;xmlns:x&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="root"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Slider&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="LowerSlider"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Minimum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=root, Path=Minimum}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Maximum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=root, Path=Maximum}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Value&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=root, Path=LowerValue}"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Slider&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="UpperSlider"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Minimum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=root, Path=Minimum}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Maximum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=root, Path=Maximum}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Value&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=root, Path=UpperValue}"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;UserControl&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

As you can see we give the UserControl element a name. This is supported in WPF but not recommended in Silverlight. This is because in Silverlight an element can only have one name and therefore if we specify a Name where we use the control, like this:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;local:RangeSlider&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="overridingName"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

the internal ElementName binding will now fail (silently) because we changed the name. One solution might be to *not* rename the element where it's used but there's another problem: we can only use this control once or we'll have two elements with the same name.&lt;p /&gt;This is very sad and I hope this is fixed in future releases. However, there is a workaround that seems to achieve what I want to achieve.&lt;p /&gt;The trick is to use ambient binding (no ElementName) by programmatically setting the DataContext in the control's constructor:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; RangeSlider()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InitializeComponent();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;this&lt;/span&gt;.Loaded += &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; RoutedEventHandler(RangeSlider_Loaded);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LayoutRoot.DataContext &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;this&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

Notice that we specifically don't set &lt;strong&gt;this.DataContext = this;&lt;/strong&gt;. That would break any bindings specified on the UserControl externally. Instead, we head for the first child of our UserControl - in this case, called 'LayoutRoot'.&lt;p /&gt;Here's the Xaml for the UserControl:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;UserControl&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Class&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="UserControlFunSL3.RangeSlider"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;xmlns&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;xmlns:x&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Grid&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="LayoutRoot"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;VerticalAlignment&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Top"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!-- resources will go here --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Border&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;BorderThickness&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="0,1,0,0"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;BorderBrush&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Black"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;VerticalAlignment&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Center"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Height&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="1"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Margin&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="5,0,5,0"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Slider&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="LowerSlider"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Minimum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding Minimum}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Maximum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding Maximum}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Value&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding LowerValue, Mode=TwoWay}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Margin&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="0,0,10,0"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Template&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{StaticResource sliderTemplate}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Slider&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="UpperSlider"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Minimum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding Minimum}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Maximum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding Maximum}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Value&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding UpperValue, Mode=TwoWay}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Margin&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="10,0,0,0"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Template&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{StaticResource sliderTemplate}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Grid&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;UserControl&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

Finally, we need our Silverlight specific Slider Template:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Grid.Resources&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;ControlTemplate&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Key&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="buttonTemplate"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;TargetType&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="RepeatButton"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!-- just empty--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Grid&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;ControlTemplate&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;ControlTemplate&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Key&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="sliderTemplate"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;TargetType&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Slider"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Grid&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="HorizontalTemplate"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Background&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{TemplateBinding Background}"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Grid.ColumnDefinitions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;ColumnDefinition&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Width&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Auto"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;ColumnDefinition&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Width&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Auto"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;ColumnDefinition&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Width&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="*"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Grid.ColumnDefinitions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;RepeatButton&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Template&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{StaticResource buttonTemplate}"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;IsTabStop&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="False"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;IsEnabled&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="False"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="HorizontalTrackLargeChangeDecreaseRepeatButton"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;/span&gt; Grid.Column="0"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Thumb&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;IsTabStop&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="True"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Height&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="18"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="HorizontalThumb"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Width&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="11"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;/span&gt; Grid.Column="1"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Thumb.Template&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;ControlTemplate&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;TargetType&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Thumb"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Rectangle&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Fill&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Red"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Stroke&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Black"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;StrokeThickness&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="1"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;ControlTemplate&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Thumb.Template&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Thumb&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;RepeatButton&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Template&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{StaticResource buttonTemplate}"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;IsTabStop&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="False"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;IsEnabled&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="False"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="HorizontalTrackLargeChangeIncreaseRepeatButton"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;/span&gt; Grid.Column="2"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Grid&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;ControlTemplate&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/Grid.Resources&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

&lt;p&gt;And we're done. Almost everything else is the same as our WPF control. Why not have a play with the control right here:&lt;/p&gt;

&lt;script type="text/javascript" src="http://www.thejoyofcode.com/Silverlight.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
function createSilverlight_userControlFunSL3()
{
Silverlight.createObjectEx({
source: "http://www.thejoyofcode.com/uploads/UserControlFunSL3.xap",
parentElement: document.getElementById("createSilverlight_userControlFunSL3"),
id: "SilverlightControl",
properties: {
width: "450px",
height: "150px",
version: "3.0",
enableHtmlAccess: "true"
},
events: {
onError: null,
onLoad: null
}});
}
&lt;/script&gt;

&lt;div id="createSilverlight_userControlFunSL3"&gt;
&lt;script type="text/javascript"&gt;
createSilverlight_userControlFunSL3();
&lt;/script&gt;
&lt;/div&gt;

&lt;p&gt;Or, get the source here: &lt;a href="http://www.thejoyofcode.com/uploads/userControlFunSL3.zip"&gt;Download Source (7KB)&lt;/a&gt;. Usual disclaimers for demoware apply.&lt;/p&gt;
        &lt;img src="http://www.thejoyofcode.com/feed.gif?Creating a Range Slider in Silverlight (and some of the binding gotchas in SL3)" width="1" height="1" alt="" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=SLLVzuzxbKQ:BzYfcEZT-PI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=SLLVzuzxbKQ:BzYfcEZT-PI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Thu, 16 Jul 2009 04:12:06 GMT</pubDate><dc:date>2009-07-16T04:12:06.903Z</dc:date><guid isPermaLink="true">http://www.thejoyofcode.com/Creating_a_Range_Slider_in_Silverlight_and_some_of_the_binding_gotchas_in_SL3_.aspx</guid><dc:creator>Josh Twist</dc:creator><category>MVVM</category><category>WPF</category><category>Silverlight</category><slash:comments>2</slash:comments><comments>http://www.thejoyofcode.com/Creating_a_Range_Slider_in_Silverlight_and_some_of_the_binding_gotchas_in_SL3_.aspx#comments</comments><wfw:commentRss>http://www.thejoyofcode.com/Feed.ashx?feed=%2FComments%2FRSS_2-0&amp;PostId=10757576-0a7d-4bf4-ac25-4a6d6838e14f</wfw:commentRss></item><item><title>Creating a Range Slider in WPF (and other cool tips and tricks for UserControls)</title><link>http://www.thejoyofcode.com/Creating_a_Range_Slider_in_WPF_and_other_cool_tips_and_tricks_for_UserControls_.aspx</link><description>I've had to create a &lt;strong&gt;RangeSlider&lt;/strong&gt; (where you can select a range within a range, not just a value) several times now and there's a couple of neat tricks I use to compose such controls that I thought I'd share with you.

&lt;p&gt;&lt;img src="http://www.thejoyofcode.com/uploads/basicSlider.png" alt="Basic Slider" /&gt;&lt;/p&gt;

The idea is simple, the control should look like a slider but with two 'thumbs':

&lt;p&gt;&lt;img src="http://www.thejoyofcode.com/uploads/rangeSlider.png" alt="Range Slider" /&gt;&lt;/p&gt;

The way I chose to tackle this was, as always, to leverage existing controls wherever possible. Composition is king in WPF and UserControls provide a very lightweight, cheap angle of attack here.&lt;p /&gt;I decided to have a UserControl composed, primarily, of two Sliders stack on top of each other.&lt;p /&gt;Logically, the RangeSlider would have four properties:

&lt;ul&gt;
	&lt;li&gt;Minimum (double)&lt;/li&gt;
	&lt;li&gt;LowerValue (double)&lt;/li&gt;
	&lt;li&gt;UpperValue (double)&lt;/li&gt;
	&lt;li&gt;Maximum (double)&lt;/li&gt;
&lt;/ul&gt;

So the first thing to do is add these as &lt;strong&gt;dependency&lt;/strong&gt; properties to our new UserControl (called RangeSlider):

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt; Minimum&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; (&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt;)GetValue(MinimumProperty); }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set { SetValue(MinimumProperty, value); }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;static&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;readonly&lt;/span&gt; DependencyProperty MinimumProperty &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DependencyProperty.Register(&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"Minimum"&lt;/span&gt;, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;typeof&lt;/span&gt;(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt;), &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;typeof&lt;/span&gt;(RangeSlider), &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; UIPropertyMetadata(0d));&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt; LowerValue&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; (&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt;)GetValue(LowerValueProperty); }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set { SetValue(LowerValueProperty, value); }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;static&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;readonly&lt;/span&gt; DependencyProperty LowerValueProperty &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DependencyProperty.Register(&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"LowerValue"&lt;/span&gt;, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;typeof&lt;/span&gt;(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt;), &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;typeof&lt;/span&gt;(RangeSlider), &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; UIPropertyMetadata(0d));&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt; UpperValue&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; (&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt;)GetValue(UpperValueProperty); }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set { SetValue(UpperValueProperty, value); }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;static&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;readonly&lt;/span&gt; DependencyProperty UpperValueProperty &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DependencyProperty.Register(&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"UpperValue"&lt;/span&gt;, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;typeof&lt;/span&gt;(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt;), &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;typeof&lt;/span&gt;(RangeSlider), &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; UIPropertyMetadata(0d));&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt; Maximum&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; (&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt;)GetValue(MaximumProperty); }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set { SetValue(MaximumProperty, value); }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;static&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;readonly&lt;/span&gt; DependencyProperty MaximumProperty &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DependencyProperty.Register(&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"Maximum"&lt;/span&gt;, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;typeof&lt;/span&gt;(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt;), &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;typeof&lt;/span&gt;(RangeSlider), &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; UIPropertyMetadata(1d));&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

Properties Done.

&lt;h3&gt;Big trick/tip - using binding to get control data into your composition&lt;/h3&gt;

I now need to get these properties into the controls within my UserControl. I use ElementName binding to this and it looks like this:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;UserControl&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Class&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="UserControlFun.RangeSlider"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;xmlns&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;xmlns:x&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="root"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Slider&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="LowerSlider"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Minimum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=root, Path=Minimum}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Maximum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=root, Path=Maximum}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Value&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=root, Path=LowerValue}"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Slider&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="UpperSlider"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Minimum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=root, Path=Minimum}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Maximum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=root, Path=Maximum}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Value&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=root, Path=UpperValue}"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;UserControl&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

Notice how we set a name on the UserControl which allows us to bind to him and access all his properties - inluding our juicy new ones. Even, better, because the Bindings are two way any updates propagate between the UserControl and the composed controls. Awesome. Functionally, we already have most of our control!&lt;p /&gt;Some rules need applying, e.g. the UpperValue should always be greater than or equal to the LowerValue and I'd even like one slider to drag the other along if it bumps into it.&lt;p /&gt;However, the most pressing problem at the moment is the fact that my control looks like this:

&lt;p&gt;&lt;img src="http://www.thejoyofcode.com/uploads/badSlider.png" alt="ooops!" /&gt;&lt;/p&gt;

Which is clearly wrong and, worse still, I can't click through to the LowerSlider control. &lt;p /&gt;No problem - just time to &lt;a href="TOhttp://www.thejoyofcode.com/My_dirty_little_secret_from_Reason_3._ControlTemplates.aspxDO"&gt;re-template&lt;/a&gt;! Remembering how templates work and need to be composed for each control is a nightmare.

&lt;h3&gt;little tip - steal templates from Blend&lt;/h3&gt;

Another trick I use is to get Expression Blend to reveal the internal ControlTemplates of controls. Just drag a Slider onto the design surface, right click, choose 'Edit Control Templates' &gt; 'Edit a copy' and you're away. You can now head off to Xaml view to get a good look at the ControlTemplate.

&lt;p&gt;&lt;img src="http://www.thejoyofcode.com/uploads/blendEditACopy.png" alt="Edit A Copy" /&gt;&lt;/p&gt;

Be warned, some of the ControlTemplates in WPF are extremely complicated. Don't be put off though - in our case the required template is very simple. To keep the post short, I'm going to go for a very simple looking slider, here's the ControlTemplate for the individual sliders:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;ControlTemplate&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Key&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="simpleSlider"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;TargetType&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{x:Type Slider}"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Border&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;SnapsToDevicePixels&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="true"&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;BorderBrush&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{TemplateBinding BorderBrush}"&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;BorderThickness&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{TemplateBinding BorderThickness}"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Grid&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Grid.RowDefinitions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Height&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Auto"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Height&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Auto"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;MinHeight&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{TemplateBinding MinHeight}"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;RowDefinition&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Height&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Auto"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Grid.RowDefinitions&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Rectangle&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="PART_SelectionRange"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Track&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="PART_Track"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;/span&gt; Grid.Row="1"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Track.Thumb&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Thumb&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Thumb"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Thumb.Template&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;ControlTemplate&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;TargetType&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Thumb"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Rectangle&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Fill&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Red"&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Stroke&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Black"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;StrokeThickness&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="1"&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Width&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="10"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Height&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="18"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;SnapsToDevicePixels&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="True"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;ControlTemplate&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Thumb.Template&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Thumb&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Track.Thumb&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Track&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Grid&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Border&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;ControlTemplate&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

And here's the two Sliders (and a border to create the line that represents the range):

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Grid&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;VerticalAlignment&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Top"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Border&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;BorderThickness&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="0,1,0,0"&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;BorderBrush&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Black"&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;VerticalAlignment&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Center"&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Height&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="1"&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Margin&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="5,0,5,0"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Slider&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="LowerSlider"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Minimum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=root, Path=Minimum}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Maximum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=root, Path=Maximum}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Value&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=root, Path=LowerValue}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Template&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{StaticResource simpleSlider}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Margin&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="0,0,10,0"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Slider&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="UpperSlider"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Minimum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=root, Path=Minimum}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Maximum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=root, Path=Maximum}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Value&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding ElementName=root, Path=UpperValue}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Template&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{StaticResource simpleSlider}"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Margin&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="10,0,0,0"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Grid&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

The Margins stop the two thumbs overlapping (so it looks like one literally pushes the other along). &lt;p /&gt;Finally, I had to add some code-behind (boo!) to monitor for changes in the sliders. I only want these hooked up after the control has loaded so here's the UserControl's constructor and some subsequent delegates:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; RangeSlider()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InitializeComponent();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;this&lt;/span&gt;.Loaded += RangeSlider_Loaded;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; RangeSlider_Loaded(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LowerSlider.ValueChanged += LowerSlider_ValueChanged;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UpperSlider.ValueChanged += UpperSlider_ValueChanged;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; LowerSlider_ValueChanged(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt; sender, RoutedPropertyChangedEventArgs&amp;lt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt;&amp;gt; e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UpperSlider.Value &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; Math.Max(UpperSlider.Value, LowerSlider.Value);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; UpperSlider_ValueChanged(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt; sender, RoutedPropertyChangedEventArgs&amp;lt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt;&amp;gt; e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LowerSlider.Value &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; Math.Min(UpperSlider.Value, LowerSlider.Value);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

Which altogether looks like (with some added bound textboxes to show the values):

&lt;p&gt;&lt;img src="http://www.thejoyofcode.com/uploads/rangeSliderFinished.png" alt="Finished Slider" /&gt;&lt;/p&gt;

There's plenty that I haven't accounted for in the control so far:

&lt;ul&gt;
	&lt;li&gt;Vertical Orientation&lt;/li&gt;
	&lt;li&gt;Visualising Disabled State, Focussed State etc&lt;/li&gt;
	&lt;li&gt;No doubt much, much, more...&lt;/li&gt;
&lt;/ul&gt;

Nonetheless it works reasonably well as a starter and was very easy to implement. Get the source code here: &lt;a href="http://www.thejoyofcode.com/uploads/userControlFun.zip"&gt;Download Source (9KB)&lt;/a&gt;.&lt;p /&gt;Enjoy - usual demoware disclaimers apply.

&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt; Why not check out the &lt;a href="http://www.thejoyofcode.com/Creating_a_Range_Slider_in_Silverlight_and_some_of_the_binding_gotchas_in_SL3_.aspx"&gt;Silverlight example&lt;/a&gt; in my follow up post.&lt;/p&gt;

        &lt;img src="http://www.thejoyofcode.com/feed.gif?Creating a Range Slider in WPF (and other cool tips and tricks for UserControls)" width="1" height="1" alt="" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=7pz-1wp-cp8:V2MrumWHCCo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=7pz-1wp-cp8:V2MrumWHCCo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Wed, 15 Jul 2009 14:34:52 GMT</pubDate><dc:date>2009-07-15T14:34:52.997Z</dc:date><guid isPermaLink="true">http://www.thejoyofcode.com/Creating_a_Range_Slider_in_WPF_and_other_cool_tips_and_tricks_for_UserControls_.aspx</guid><dc:creator>Josh Twist</dc:creator><category>MVVM</category><category>WPF</category><slash:comments>4</slash:comments><comments>http://www.thejoyofcode.com/Creating_a_Range_Slider_in_WPF_and_other_cool_tips_and_tricks_for_UserControls_.aspx#comments</comments><wfw:commentRss>http://www.thejoyofcode.com/Feed.ashx?feed=%2FComments%2FRSS_2-0&amp;PostId=ed09e5b0-fd57-44b3-a157-50dc0eced728</wfw:commentRss></item><item><title>Animating when Data Changes - Part II</title><link>http://www.thejoyofcode.com/Animating_when_Data_Changes_Part_II.aspx</link><description>In &lt;a href="http://www.thejoyofcode.com/Animating_when_data_changes.aspx"&gt;Animating when data changes&lt;/a&gt; I talked about some of the difficulties of using animation with the MVVM pattern and how to overcome them.&lt;p /&gt;Having discussed this post with some people they felt I targetted a fairly edge scenario, that is - content changing. What if a control is bound to a property of the view model and I want the control to animate when the value changes? &lt;p /&gt;Fair enough. The important note is that the concept is the same. In my opinion, this animation is not a concern of the ViewModel and so we need to extract it from that space. As with most problems in software development (save for code simplicity and performance) we just need another layer of indirection. In this case we'll use a UserControl.&lt;p /&gt;Imagine we have a Value property on a ViewModel and it is two-way bound to a Slider and also bound to a ProgressBar. However, we want the ProgressBar to animate smoothly when the value is changed.&lt;p /&gt;Our ViewModel might look something like this:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;class&lt;/span&gt; SimpleViewModel : INotifyPropertyChanged&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt; _value;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt; Value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; _value; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_value &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OnPropertyChanged(&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"Value"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// snipped INPC implementation for brevity&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

Easy. Our xaml might look something like this:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;StackPanel&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Slider&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Value&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding Value, Mode=TwoWay}"&lt;/span&gt;  &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Maximum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="10"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;ProgressBar&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Value&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding Value}"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Height&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="20"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Maximum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="10"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;StackPanel&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

The two controls are now bound together via our ViewModel. Let's imagine that there are multiple ways of updating the Value property (not just via the slider) and we want the ProgressBar to react in a nice animated smooth and slooooow way.&lt;p /&gt;This is a pattern I use a lot in both WPF and Silverlight to implement animation. In this case the example is Silverlight but the code for WPF is almost identical.&lt;p /&gt;First, I create a new UserControl to host the ProgressBar and add a Value Dependency Property.

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; partial &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;class&lt;/span&gt; AnimatedProgressBar : UserControl&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; AnimatedProgressBar()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InitializeComponent();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt; Value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; (&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt;)GetValue(ValueProperty); }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set { SetValue(ValueProperty, value); }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;static&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;readonly&lt;/span&gt; DependencyProperty ValueProperty &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DependencyProperty.Register(&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"Value"&lt;/span&gt;, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;typeof&lt;/span&gt;(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;double&lt;/span&gt;), &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;typeof&lt;/span&gt;(AnimatedProgressBar), &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; PropertyMetadata(0d, ValueChanged));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

Notice that I registered a DependencyPropertyChangedEventHandler called ValueChanged - more on him later.&lt;p /&gt;And the Xaml for my user control looks like this:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;UserControl&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Class&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="AnimatingOnDataChangePartII.AnimatedProgressBar"&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;xmlns&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;xmlns:x&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;ProgressBar&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="progress"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Maximum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="10"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;UserControl&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

Now, that ValueChanged handler:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;static&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; ValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// Get out of a static and into the instance ASAP.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AnimatedProgressBar control &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; (AnimatedProgressBar)sender;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;control.ValueChanged();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; ValueChanged()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DoubleAnimation animation &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; DoubleAnimation();;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;animation.To &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;this&lt;/span&gt;.Value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;animation.Duration &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; Duration(TimeSpan.FromSeconds(2));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Storyboard.SetTarget(animation, progress);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Storyboard.SetTargetProperty(animation, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; PropertyPath(ProgressBar.ValueProperty));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Storyboard sb &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; Storyboard();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Children.Add(animation);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Begin();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt; &lt;p /&gt;So, we needed a little code behind but at least it's in the right place. The animation is part of the visual implementation and nothing to do with our 'canonical ViewModel'. Even better, our root Xaml still makes sense from a binding/ViewModel perspective - thanks to our use of a Dependency Property:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;StackPanel&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Slider&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Value&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding Value, Mode=TwoWay}"&lt;/span&gt;  &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Maximum&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="10"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;local:AnimatedProgressBar&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Value&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding Value}"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Height&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="20"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;StackPanel&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

&lt;p&gt;Here's the sample for you to play with:&lt;/p&gt;

&lt;script type="text/javascript" src="http://www.thejoyofcode.com/Silverlight.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
function createSilverlight_animatedDemo()
{
Silverlight.createObjectEx({
source: "http://www.thejoyofcode.com/uploads/AnimatingOnDataChangePartII.xap",
parentElement: document.getElementById("createSilverlight_animatedDemo"),
id: "SilverlightControl",
properties: {
width: "450px",
height: "100px",
version: "2.0",
enableHtmlAccess: "true"
},
events: {
onError: null,
onLoad: null
}});
}
&lt;/script&gt;

&lt;div id="createSilverlight_animatedDemo"&gt;
&lt;script type="text/javascript"&gt;
createSilverlight_animatedDemo();
&lt;/script&gt;
&lt;/div&gt;

&lt;p&gt;And here's the source: &lt;a href="http://www.thejoyofcode.com/uploads/AnimatingOnDataChangePartII_source.zip"&gt;Download Source (24KB)&lt;/a&gt; - usual demoware disclaimers apply.&lt;/p&gt;
        &lt;img src="http://www.thejoyofcode.com/feed.gif?Animating when Data Changes - Part II" width="1" height="1" alt="" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=7nSe8Z6yDnA:NICsszXPgmg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=7nSe8Z6yDnA:NICsszXPgmg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Mon, 13 Jul 2009 02:14:25 GMT</pubDate><dc:date>2009-07-13T02:14:25.54Z</dc:date><guid isPermaLink="true">http://www.thejoyofcode.com/Animating_when_Data_Changes_Part_II.aspx</guid><dc:creator>Josh Twist</dc:creator><category>MVVM</category><category>WPF</category><category>Silverlight</category><slash:comments>2</slash:comments><comments>http://www.thejoyofcode.com/Animating_when_Data_Changes_Part_II.aspx#comments</comments><wfw:commentRss>http://www.thejoyofcode.com/Feed.ashx?feed=%2FComments%2FRSS_2-0&amp;PostId=3c1253ae-951d-49c8-8965-f7820b32e7e3</wfw:commentRss></item><item><title>Scripting Wake On Lan</title><link>http://www.thejoyofcode.com/Scripting_Wake_On_Lan.aspx</link><description>I mentioned recently about wantint to be able to wake up various machines in my house remotely. My colleague introduced me to &lt;a href="http://www.thejoyofcode.com/AutoExit_for_Windows_Home_Server.aspx"&gt;AutoExit for Windows Home Server&lt;/a&gt; which works a treat. However, logging onto the Windows Home Server console is a bit, well, slow.&lt;p /&gt;So, now that I do quite a bit of &lt;a href="http://www.thejoyofcode.com/Building_an_Atom_based_media_PC_for_the_house.aspx"&gt;remote desktop&lt;/a&gt; to my development machine I want a quicker, easier way of waking it up.&lt;p /&gt;The solution was a .bat file that uses the very handy WoLCmd command line executable from &lt;a href="http://www.depicus.com/wake-on-lan/"&gt;www.depicus.com&lt;/a&gt;. There's also a GUI, an ASP and a COM version. Very handy.&lt;p /&gt;They even provide the .NET source to Wake-on-Lan yourself &lt;a href="http://www.depicus.com/wake-on-lan/woli-code.zip"&gt;here&lt;/a&gt;.&lt;p /&gt;Anyway, I simply botched a bat file together next to my downloaded copy of WolCmd and created a shortcut to the batch file on my desktop. Here's the script:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;echo on&lt;br /&gt;wolcmd.exe &amp;lt;MAC-ADDRESS-HERE&amp;gt; &amp;lt;IP-ADDRESS-HERE&amp;gt; 255.255.255.0 7&lt;br /&gt;pause&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

Easy.
        &lt;img src="http://www.thejoyofcode.com/feed.gif?Scripting Wake On Lan" width="1" height="1" alt="" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=Cb5q1nFDD_U:ouhpE7RCjPE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=Cb5q1nFDD_U:ouhpE7RCjPE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Tue, 30 Jun 2009 02:13:20 GMT</pubDate><dc:date>2009-06-30T02:13:20.74Z</dc:date><guid isPermaLink="true">http://www.thejoyofcode.com/Scripting_Wake_On_Lan.aspx</guid><dc:creator>Josh Twist</dc:creator><category>Home Computing</category><slash:comments>0</slash:comments><comments>http://www.thejoyofcode.com/Scripting_Wake_On_Lan.aspx#comments</comments><wfw:commentRss>http://www.thejoyofcode.com/Feed.ashx?feed=%2FComments%2FRSS_2-0&amp;PostId=46f1990d-820e-4648-b348-cb54f0d935f5</wfw:commentRss></item><item><title>Building an Atom-based media PC for the house</title><link>http://www.thejoyofcode.com/Building_an_Atom_based_media_PC_for_the_house.aspx</link><description>I believe there's a rule that goes along the lines of:

&lt;p class="quote"&gt;If you have a blog, and you build a PC, you must write a review/walkthrough of the process and post it; with lots of pictures. This is mandatory and failure to comply is punishable by nail-varnishing of the eyeballs.&lt;/p&gt;

Now, not wanting to have my eyeballs nail varnished, I thought I better follow suit. Weirdly, this is the first time I've ever built a PC from scratch. I've pulled existing PCs to pieces and failed to put them back together hundreds of times but never started from fresh bits like this. It was exciting.

&lt;p&gt;&lt;img src="http://www.thejoyofcode.com/uploads/newPC-inBoxes.jpg" alt="All boxed up" /&gt;&lt;/p&gt;

The requirements/considerations for my new PC are as follows:

&lt;ol&gt;
	&lt;li&gt;The primary purpose would be as a &lt;strong&gt;media PC&lt;/strong&gt; to go with the TV in our second living room (so I can watch Grand Prix without annoying the wife)&lt;/li&gt;
	&lt;li&gt;I'd like it to house the &lt;a href="http://www.thejoyofcode.com/Fun_with_a_Power_and_Energy_Monitor.aspx"&gt;Blu-Ray drive I harvested from my server&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;It needs to be small enough to fit on a shelf&lt;/li&gt;
	&lt;li&gt;The secondary purpose would be as a head to Remote-Desktop in to my development PC when I fancied doing a bit of dev in another room&lt;/li&gt;
	&lt;li&gt;The room can get bloody hot on a hot day, so cooling might be an issue&lt;/li&gt;
	&lt;li&gt;It needs to be fairly quiet, though I'm not as fussy about most on this - background noise tends not to bother me too much&lt;/li&gt;
	&lt;li&gt;Now that I've &lt;a href="http://www.thejoyofcode.com/Fun_with_a_Power_and_Energy_Monitor.aspx"&gt;gone Power Nuts&lt;/a&gt;, I'd like it not to consume too much power either&lt;/li&gt;
&lt;/ol&gt;

The natural choice at the moment for any low-power small-form-factor PC is the Intel Atom of netbook/nettop fame. However, traditionally they've been underpowered in the graphics department for use as a media PC. Until the &lt;a href="TODO"&gt;nVidia ION&lt;/a&gt; came along.&lt;p /&gt;I decided to opt for the Zotac IONITX A-B N330 whose highlights include:

&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;dual-core&lt;/strong&gt; Atom processor&lt;/li&gt;
	&lt;li&gt;nVidia ION graphics&lt;/li&gt;
	&lt;li&gt;Includes &lt;strong&gt;external&lt;/strong&gt; 90W power supply&lt;/li&gt;
	&lt;li&gt;bundled WiFi (occupying the only PCI-E x1 slot)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="http://www.thejoyofcode.com/uploads/newPC-1.jpg" alt="N330 Zotac IONITX" /&gt;&lt;/p&gt;

You can read a good review of this board &lt;a href="http://www.silentpcreview.com/zotac-ion"&gt;here&lt;/a&gt; on &lt;a href="http://www.silentpcreview.com/"&gt;silentpcreview.com&lt;/a&gt;.&lt;p /&gt;The dual core version comes with an optional fan where according to the documentation "If your system working at a torrid room,you can append a FAN to the heatsink (sic)". That's one description for the conservatory on a very hot day with the windows closed. And thus, I decided to attach the fan. It's a little noisier than I'd like and there's no way to slow it down. I suspect I may replace this at some point in the near future with a quieter model but for now, it keeps the heatsink incredibly cool (before the fan was attached, the heatsink was too hot to touch).&lt;p /&gt;Anyway, I won't bore you with all the details of the build but here are the mandatory pictures of the build.

&lt;p&gt;&lt;img src="http://www.thejoyofcode.com/uploads/newPC-2.jpg" alt="The cheesiest RAM in the world" /&gt;&lt;/p&gt;
The cheesiest RAM in the world (above).
&lt;p&gt;&lt;img src="http://www.thejoyofcode.com/uploads/newPC-3.jpg" alt="The N330 close up" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.thejoyofcode.com/uploads/newPC-4.jpg" alt="Inside the case" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.thejoyofcode.com/uploads/newPC-5.jpg" alt="It lives!" /&gt;&lt;/p&gt;
It lives! (above)
&lt;p&gt;&lt;img src="http://www.thejoyofcode.com/uploads/newPC-6.jpg" alt="The fan, mounted by screwing into the heatsink - quite bizzarre as there aren't any 'holes'" /&gt;&lt;/p&gt;
The fan, mounted by screwing into the heatsink - quite bizarre as there aren't any 'holes' (above)
&lt;p&gt;&lt;img src="http://www.thejoyofcode.com/uploads/newPC-7.jpg" alt="After a bit of a tidy courtesy of some cable ties" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.thejoyofcode.com/uploads/newPC-8.jpg" alt="Drawing just 33W during playback of a large mpeg file" /&gt;&lt;/p&gt;

The case is an &lt;strong&gt;A+ Cupid-3&lt;/strong&gt; which was particularly suitable as it was mini-ITX and offered a full-size 5.25" drive bay to host the huuuge Blu-Ray drive. The case actually came with a 200W PSU but I removed that as the motherboard has its own external PSU and can happily power three SATA devices inside the case (I only needed two) - so if you need a 200W PSU, give me a shout :).&lt;p /&gt;The case is also pretty attractive and was very easy to work with. There's still room for an extra 3.5" HDD too, which is good.

&lt;h3&gt;The monitor&lt;/h3&gt;

The best part of my new computing experience has to be the 26" Samsung Syncmaster LCD TV/Monitor I picked up. 26" isn't that largest TV screen in the world but it's a big monitor. And it's a thing of beauty - I'm already addicted to using it over all my other monitors. The quality of the picture is amazing. The sound is a little weak but I'll be routing that over a hi-fi so no issue there for me.

&lt;h3&gt;The finished package&lt;/h3&gt;

&lt;p&gt;&lt;img src="http://www.thejoyofcode.com/uploads/newPC-finished.jpg" alt="The finished package" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.thejoyofcode.com/uploads/newPC-rating.png" alt="Not a bad score!" /&gt;&lt;/p&gt;

Here's the links to the bits I bought from the stores I used:

&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.scan.co.uk/Product.aspx?WebProductId=985222"&gt;A+ Cupid-3 Mini ITX Case (inc PSU)&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.scan.co.uk/Products/4GB-(2x2GB)-Super-Talent-Twin-DDR2-PC2-6400-(800MHz)-240-Pins-Non-ECC-Unbuffered-CAS-5-5-5-15"&gt;4GB (2x2GB) Super*Talent DDR2 800 RAM&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.itx-warehouse.co.uk/Product.aspx?ProductID=1039"&gt;Zotac ION ATOM N330 Dual Core motherboard&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.amazon.co.uk/Samsung-T260HD-Widescreen-Gloss-Monitor/dp/B0018NLVOM/ref=sr_1_1?ie=UTF8&amp;s=electronics&amp;qid=1246171237&amp;sr=8-1"&gt;Samsung T260HD LCD/TV Monitor&lt;/a&gt;&lt;/li&gt; (I actually purchased this from Costco where they offer a free 5 year warranty at the same price).
&lt;/ul&gt;


        &lt;img src="http://www.thejoyofcode.com/feed.gif?Building an Atom-based media PC for the house" width="1" height="1" alt="" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=t4mGt0MhhUs:TKqp6qxsHck:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=t4mGt0MhhUs:TKqp6qxsHck:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Sun, 28 Jun 2009 10:26:50 GMT</pubDate><dc:date>2009-06-28T10:26:50.46Z</dc:date><guid isPermaLink="true">http://www.thejoyofcode.com/Building_an_Atom_based_media_PC_for_the_house.aspx</guid><dc:creator>Josh Twist</dc:creator><category>Home Computing</category><slash:comments>4</slash:comments><comments>http://www.thejoyofcode.com/Building_an_Atom_based_media_PC_for_the_house.aspx#comments</comments><wfw:commentRss>http://www.thejoyofcode.com/Feed.ashx?feed=%2FComments%2FRSS_2-0&amp;PostId=a68ec09f-6e07-45c0-a0e8-b0e8f55e3a54</wfw:commentRss></item><item><title>Silverlight Validation and ViewModel</title><link>http://www.thejoyofcode.com/Silverlight_Validation_and_ViewModel.aspx</link><description>Silverlight 3 brings some improvements to Validation for users of the MVVM (Model-View-ViewModel, or just ViewModel) pattern. Specifically, most controls now have a Visual State for a control that has generated binding validation errors.&lt;p /&gt;The default InvalidFocused state looks pretty cool:

&lt;p&gt;&lt;img src="http://www.thejoyofcode.com/uploads/sl3invalidstate.png" alt="InvalidFocused state in SL3" /&gt;&lt;/p&gt;

And, with Silverlight's &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.binding(VS.95).aspx"&gt;Binding&lt;/a&gt; supporting &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.binding.validatesonexceptions(VS.95).aspx"&gt;ValidatesOnExceptions&lt;/a&gt; (publishes a validation error if a setter throws an exception) and &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.binding.validatesonexceptions(VS.95).aspx"&gt;NotifyOnValidationError&lt;/a&gt; (sends a &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.bindingvalidationerror(VS.95).aspx"&gt;BindingValidationError&lt;/a&gt; event up tree) it's easy to use this with the ViewModel pattern.

&lt;h3&gt;Filling in the details&lt;/h3&gt;

Most examples out there demonstrate how to use these capabilities so I won't go into the gritty details. However, I want to try and take that knowledge and try to apply it in a slightly more reusable way. There are two key problems I'm trying to solve.

&lt;h3&gt;The first problem... dealing with _your_ exceptions&lt;/h3&gt;

The first is that it becomes difficult for us to tell if our ViewModel is in a valid state or not. Take the following very simple ViewModel:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;class&lt;/span&gt; MyViewModel : INotifyPropertyChanged&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;int&lt;/span&gt; _age &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; 1;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;int&lt;/span&gt; Age&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; _age; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;if&lt;/span&gt; (value &amp;lt;= 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;throw&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; Exception(&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"Age must be greater than 0"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_age &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OnPropertyChanged(&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"Age"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; Save()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// TODO&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// NotifyPropertyChanged implementation snipped for brevity&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

And the Xaml with the binding:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;TextBox&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Text&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding Path=Age, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnExceptions=True}"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

As you can see, this ViewModel has been designed to leverage the ValidatesOnExceptions feature of Silverlight's Binding, raising an Exception if somebody tries to set the Age property to 0 or less (the image above shows how this would look).&lt;p /&gt;The problem comes when we try to 'save' the state of the ViewModel. How can we tell if it's valid or not? Following a Validation Failure we throw an exception and don't set the value of the _age property. Therefore the ViewModel itself is still actually valid.&lt;p /&gt;I can think of a myriad of solutions to this ranging from leveraging some of the features in existing validation frameworks like P&amp;amp;P's Validation Application Block (which is a good idea in any case) to simply allowing the Age property to be set _before_ throwing the Exception. Now the object will be in an 'invalid' state and we can prevent a 'save' taking place.&lt;p /&gt;We're half way there...

&lt;h3&gt;The second problem... dealing with binding failures&lt;/h3&gt;

However, the solution above only works if the TwoWay binding succeeds. What if the user enters 'hello' into the Age field?

&lt;p&gt;&lt;img src="http://www.thejoyofcode.com/uploads/bindingFailed.png" alt="Binding failure" /&gt;&lt;/p&gt;

That's handy but the update never made it to the ViewModel so, as far as it knows, it's still in a valid state so we can't prevent the save taking place.

&lt;h3&gt;A solution?&lt;/h3&gt;

Since the ViewModel is all about the state of the view, it seems fair that it should be aware of *all* binding and validation failures like this. After all, it might want to host that information so another part of the View can display all the current failures. A validation summary if you will - but in a ViewModel way.&lt;p /&gt;Of course, being a no-code-behind zealot. I'd like to achieve this with as little code-behind as possible in the view. Step forward &lt;a href="http://blogs.msdn.com/johngossman/archive/2008/05/07/the-attached-behavior-pattern.aspx"&gt;Attached Behaviors&lt;/a&gt;.&lt;p /&gt;My idea is to have an attached property called ValidationScope.Errors that can be attached to any FrameworkElement. The property would be of type IList&lt;ValidationError&gt; and would handle the BindingValidationError for the element to which it's attached (creating a ValidationScope, effectively).&lt;p /&gt;Then all we need to do is bind this attached property to an ObservableCollection&lt;ValidationError&gt; on our ViewModel.&lt;p /&gt;Here's the Attached Behavior/Property:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;class&lt;/span&gt; ValidationScope&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;static&lt;/span&gt; IList&amp;lt;ValidationError&amp;gt; GetErrors(DependencyObject obj)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; (IList&amp;lt;ValidationError&amp;gt;)obj.GetValue(ErrorsProperty);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;static&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; SetErrors(DependencyObject obj, IList&amp;lt;ValidationError&amp;gt; value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;obj.SetValue(ErrorsProperty, value);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// Using a DependencyProperty as the backing store for Errors.  This enables animation, styling, binding, etc...&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;static&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;readonly&lt;/span&gt; DependencyProperty ErrorsProperty &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DependencyProperty.RegisterAttached(&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;"Errors"&lt;/span&gt;, &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;typeof&lt;/span&gt;(IList&amp;lt;ValidationError&amp;gt;), &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;typeof&lt;/span&gt;(ValidationScope), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; PropertyMetadata(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;null&lt;/span&gt;, ErrorsChanged));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;static&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; ErrorsChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FrameworkElement element &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; (FrameworkElement)obj;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;element.BindingValidationError += &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;delegate&lt;/span&gt;(&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;object&lt;/span&gt; sender, ValidationErrorEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;if&lt;/span&gt; (e.Action == ValidationErrorEventAction.Added)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GetErrors(obj).Add(e.Error);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GetErrors(obj).Remove(e.Error);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

And here it is being used by our Xaml:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Grid&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;x:Name&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="LayoutRoot"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Background&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="White"&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;/span&gt; local:ValidationScope.Errors="{Binding Errors}"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;StackPanel&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;TextBlock&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Text&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Name:"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;TextBox&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Text&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding Path=Name, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnExceptions=True}"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;TextBlock&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Text&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Age:"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;TextBox&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Text&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="{Binding Path=Age, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnExceptions=True}"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Button&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Content&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Save"&lt;/span&gt; &lt;span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Click&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;="Button_Click"&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;StackPanel&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;Grid&lt;/span&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

Clearly, we need an 'Errors' property on our ViewModel:

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;readonly&lt;/span&gt; ObservableCollection&amp;lt;ValidationError&amp;gt; _errors &lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;=&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;new&lt;/span&gt; ObservableCollection&amp;lt;ValidationError&amp;gt;();&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; ObservableCollection&amp;lt;ValidationError&amp;gt; Errors&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; _errors; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;bool&lt;/span&gt; IsViewStateValid()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;return&lt;/span&gt; Errors.Count == 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

Notice that we can easily add an IsViewStateValid method too that simply sniffs the Errors collection.&lt;p /&gt;And our save method?

&lt;span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;&lt;br /&gt;&lt;br /&gt;pbulic &lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;void&lt;/span&gt; Save()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;if&lt;/span&gt; (!&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;this&lt;/span&gt;.IsViewStateValid())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_dialogService.DisplayValidationDialog(Errors);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: Green; background-color: Transparent; font-family: Courier New; font-size: 11px"&gt;// TODO - SaveData&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;

In my example, I used one of Silverlight's new Child Windows to display my error dialog - passing the Errors collection so it could be used as a ViewModel for the dialog:

&lt;p&gt;&lt;img src="http://www.thejoyofcode.com/uploads/invalidDialog.png" alt="Invalid Dialog" /&gt;&lt;/p&gt;

:)

&lt;p class="callout"&gt;There are other challenges ahead though.. what happens if an object's state can be rendered invalid by a combination of properties? For example, maiden name should be blank if sex == male? In that case it becomes difficult to use the practice of throwing exceptions in setters as you start a chicken/egg race. For these reasons, I'd look at patterns like the Validation Application Block and lean on their concepts when implementing a full LOB validation approach.&lt;/p&gt;

&lt;p class="callout"&gt;Having said all that - before doing any of this you should definitely check out Silverlight 3's DataForm control. You could do much worse than spend 25 minutes watching Mike Taulty's excellent screencast: &lt;a href="http://silverlight.net/learn/learnvideo.aspx?video=187317"&gt;DataForm control&lt;/a&gt;. In particular, pay attention to some of the Validation support including the CustomValidation attribute.&lt;/p&gt;

Finally, if you'd like the code from the example I worked up before, you can &lt;a href="http://www.thejoyofcode.com/uploads/SLValidationSample.zip"&gt;download it here&lt;/a&gt;. Usual disclaimers apply - this is just demoware.
        &lt;img src="http://www.thejoyofcode.com/feed.gif?Silverlight Validation and ViewModel" width="1" height="1" alt="" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=GaplAR1rD7s:ZjWgNKwWwZA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheJoyOfCode?a=GaplAR1rD7s:ZjWgNKwWwZA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheJoyOfCode?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><pubDate>Fri, 26 Jun 2009 01:54:22 GMT</pubDate><dc:date>2009-06-26T01:54:22.553Z</dc:date><guid isPermaLink="true">http://www.thejoyofcode.com/Silverlight_Validation_and_ViewModel.aspx</guid><dc:creator>Josh Twist</dc:creator><category>MVVM</category><category>Silverlight</category><slash:comments>3</slash:comments><comments>http://www.thejoyofcode.com/Silverlight_Validation_and_ViewModel.aspx#comments</comments><wfw:commentRss>http://www.thejoyofcode.com/Feed.ashx?feed=%2FComments%2FRSS_2-0&amp;PostId=b3009d3a-9eb9-4d1c-ba75-2fc84408c421</wfw:commentRss></item></channel></rss>
