<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3165870666914080508</id><updated>2012-01-08T23:07:09.583-08:00</updated><category term='Rx'/><category term='PRISM'/><category term='SSL'/><category term='Toolkit'/><category term='MVVM'/><category term='Powershell'/><category term='CollectionViewSource'/><category term='Ninject'/><category term='ASP.NET'/><category term='Silverlight'/><title type='text'>Maarten De Wilde</title><subtitle type='html'>Silverlight, ASP.NET, WPF and General Development</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://maartendewilde.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://maartendewilde.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Maarten De Wilde</name><uri>http://www.blogger.com/profile/11263486577385249299</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_aTL6Htl2AhY/S7tcL0sjxCI/AAAAAAAAAAs/_QXOcUynJaE/S220/Thumb1.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3165870666914080508.post-2527733902908027360</id><published>2011-01-25T15:11:00.001-08:00</published><updated>2011-01-25T15:18:17.241-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVVM'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Ninject'/><title type='text'>Auto-ViewModel binding with Ninject</title><content type='html'>&lt;p&gt;I have done a lot of post about binding ViewModels to Views in Silverlight, so can you see that it is really a subject I am quite interested in.&amp;#160; It also allows me to learn more about several technologies all in the context of this domain.&lt;/p&gt;  &lt;p&gt;Having said this, lets have a look at using Ninject for Injecting our ViewModels into our Views.&amp;#160; We are going to use the concept of a ViewModelLocator that will be hosting our Ninject kernel in the application scope.&lt;/p&gt;  &lt;p&gt;This means we are going to host our Locator as a resource in our App.xaml resource dictionary and bind to it in our views, using the StaticResource as a source.&lt;/p&gt; You would go about doing this as following, and reference it in your code  &lt;pre class="brush: xml"&gt;&amp;lt;Application.Resources&amp;gt; &lt;br /&gt;  &amp;lt;Foo:ViewModelLocator x:Key=&amp;quot;viewModelLocator&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/Application.Resources&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;UserControl DataContext=&amp;quot;{Binding [Bar], Source={StaticResource viewModelLocator}}&amp;quot;/&amp;gt; &lt;/pre&gt;&lt;br /&gt;You can see that we have defined our ViewModel with the name ‘Bar’ and within square brackets, this means we are binding to an indexer of the ViewModelLocator.&amp;#160; This allows us to do some pretty cool stuff, on the expense of loosing Intelli-Sense.&lt;br /&gt;So lets get started on writing our locator, we first start my setting up our class and initializing some Ninject stuff, creating the Kernel, adding modules,… &lt;br /&gt;&lt;pre class="brush: csharp"&gt;public class ViewModelLocator&lt;br /&gt;{&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;  private readonly IKernel kernel;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;  public ViewModelLocator()&lt;br /&gt;  {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;    kernel = new StandardKernel(GetModules());&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;    kernel.Load();&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;So the really cool thing we can do now, is create an indexer that will allow us the query our ViewModels setup in our Kernel dynamically without having to type it, and add a new Property for every ViewModel. &lt;br /&gt;&lt;br /&gt;The indexer is pretty straightforward, it looks like this : &lt;br /&gt;&lt;pre class="brush: csharp"&gt;public object this[string viewModel]&lt;br /&gt;{&lt;br /&gt;  get { return GetViewModel(viewModel); }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;So as you could imagine, the real stuff goes on in the GetViewModel method, so lets have a quick look at that now, I'll explain what we are doing here afterwards. &lt;br /&gt;&lt;pre class="brush: csharp"&gt;private object GetViewModel(string viewModel)&lt;br /&gt;{&lt;br /&gt;    String viewModelName = viewModel;&lt;br /&gt;    if (!viewModel.ToUpper().EndsWith(&amp;quot;VIEWMODEL&amp;quot;))&lt;br /&gt;    {&lt;br /&gt;        viewModelName = viewModelName + &amp;quot;ViewModel&amp;quot;;&lt;br /&gt;    }&lt;br /&gt;    return kernel.Get(GetViewModelType(viewModelName));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private Type GetViewModelType(string viewModelname)&lt;br /&gt;{&lt;br /&gt;    foreach (string location in GetLocations())&lt;br /&gt;    {&lt;br /&gt;      Type type = Type.GetType(string.Format(&amp;quot;{0}.{1}&amp;quot;, location, viewModelname), false, true);&lt;br /&gt;      if (type != null)&lt;br /&gt;          return type;&lt;br /&gt;    }&lt;br /&gt;    return null;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;When we are calling our “Bar” viewmodel, the GetViewModel method will get a string with the value '”Bar”, from this it will need to locate the ViewModel from our kernel which could have a whole bunch of dependency’s injected ( or should I say nInjected ) into it. &lt;br /&gt;&lt;br /&gt;Our locator will will take into account a few conventions, it will check the ViewModel string ends with “ViewModel” and if not will append it.&amp;#160; It will then attempt to find the ViewModel Type and return the corresponding instance of that type from the Ninject kernel. &lt;br /&gt;&lt;br /&gt;This is where our last convention comes into play, our ViewModels in our application will most likely be located on some very well defined locations (hence the GetLocations method). We can easily define these conventions and possibly even add new ones later, a simple convention for locations might look something like this : &lt;br /&gt;&lt;pre class="brush: csharp"&gt; private IEnumerable&lt;string&gt; GetLocations()&lt;br /&gt; {&lt;br /&gt;      string applicationNamespace = GetType().Namespace;&lt;br /&gt;      yield return applicationNamespace;&lt;br /&gt;      yield return applicationNamespace + &amp;quot;.Shared&amp;quot;;&lt;br /&gt;      yield return applicationNamespace + &amp;quot;.Shared.ViewModel&amp;quot;;&lt;br /&gt;      yield return applicationNamespace + &amp;quot;.Views&amp;quot;;&lt;br /&gt;      yield return applicationNamespace + &amp;quot;.Views.ViewModel&amp;quot;;&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So this way you can add ViewModels with Ninject without having to define any properties to bind to, you just have to type your ViewModel’s name and the locator will do the rest for you.  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3165870666914080508-2527733902908027360?l=maartendewilde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maartendewilde.blogspot.com/feeds/2527733902908027360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maartendewilde.blogspot.com/2011/01/auto-viewmodel-binding-with-ninject.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/2527733902908027360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/2527733902908027360'/><link rel='alternate' type='text/html' href='http://maartendewilde.blogspot.com/2011/01/auto-viewmodel-binding-with-ninject.html' title='Auto-ViewModel binding with Ninject'/><author><name>Maarten De Wilde</name><uri>http://www.blogger.com/profile/11263486577385249299</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_aTL6Htl2AhY/S7tcL0sjxCI/AAAAAAAAAAs/_QXOcUynJaE/S220/Thumb1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3165870666914080508.post-5737139451485640124</id><published>2010-10-19T13:46:00.001-07:00</published><updated>2010-10-20T10:52:32.388-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVVM'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>Automatic MVVM Command Binding</title><content type='html'>&lt;p&gt;When working with MVVM it can be quite a lot of work to wire up all commands with the view, bind them and make sure the right method was called.&lt;/p&gt;  &lt;p&gt;Furthermore, you would need a property in your ViewModel that would bind to the view, wouldn’t it be nice to just have some methods in your ViewModel that would just like that respond to the buttons you click.&lt;/p&gt;  &lt;p&gt;I came across this technique while looking at a MIX talk by Rob Eisenberg. The following example is an easy to use simple framework. It allows you to implement this quickly.&amp;#160; And use it without needing to change a lot of your already in place MVVM screens.&amp;#160; It is based on a great MVVM framework that Rob has been working on : &lt;strong&gt;&lt;a href="http://caliburn.codeplex.com/"&gt;Caliburn&lt;/a&gt;&lt;/strong&gt; , which definitely is worth a look.&lt;/p&gt;  &lt;p&gt;The concept that we are working with here, is to have some convention in our application in regards to using ViewModels and &lt;strong&gt;Commands&lt;/strong&gt;.&amp;#160; The convention in this example is that all methods used for handling commands start with “&lt;em&gt;Execute&lt;/em&gt;” and end with “&lt;em&gt;Command&lt;/em&gt;”.&amp;#160; This is a very intuitive way to write commands, and is actually the way I was declaring then before I started to use this setup.&lt;/p&gt;  &lt;p&gt;Lets say for a moment, we want to create new MVVM screen using a ViewModel, in this example we want to declare our ViewModel inside our View by calling an extension method “&lt;u&gt;&lt;em&gt;Bind&amp;lt;TViewModel&amp;gt;()&lt;/em&gt;&lt;/u&gt;” and binding the ViewModel to it.&amp;#160; You could eventually extract this into a Bootstrapper or so… But for now we will just keep it this way.&lt;/p&gt;  &lt;p&gt;Our first class to do this, is our Extension class called “&lt;em&gt;MvvmBindingExtension&lt;/em&gt;”.&amp;#160; It accepts a &lt;strong&gt;&lt;u&gt;TViewModel&lt;/u&gt;&lt;/strong&gt; generic type and reflects all &lt;em&gt;Command&lt;/em&gt; methods in it.&amp;#160; Then it binds them to the View so they can be invoked.&lt;/p&gt;  &lt;p&gt;Lets have a look at the implementation of this extension.&lt;/p&gt;  &lt;pre class="brush: csharp"&gt;public static class MvvmBindingExtension&lt;br /&gt;{&lt;br /&gt;        private const string COMMAND_METHOD_PREFIX = &amp;quot;Execute&amp;quot;;&lt;br /&gt;        private const string COMMAND_METHOD_SUFFIX = &amp;quot;Command&amp;quot;;&lt;br /&gt;&lt;br /&gt;        /// &amp;lt;summary&amp;gt;&lt;br /&gt;        /// Bind a ViewModel to a View, and auto bind commands&lt;br /&gt;        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;        /// &amp;lt;typeparam name=&amp;quot;TViewModel&amp;quot;&amp;gt;The ViewModel that should be &amp;lt;/typeparam&amp;gt;&lt;br /&gt;        /// &amp;lt;param name=&amp;quot;element&amp;quot;&amp;gt;The view we want to bind our viewmodel to&amp;lt;/param&amp;gt;&lt;br /&gt;        public static void Bind&amp;lt;TViewModel&amp;gt;(this FrameworkElement view) where TViewModel : new()&lt;br /&gt;        {&lt;br /&gt;            //Create an instance of our viewModel&lt;br /&gt;            object viewModel = new TViewModel();&lt;br /&gt;&lt;br /&gt;            //Get the type of the viewmodel for reflection purposes.&lt;br /&gt;            Type viewModelType = viewModel.GetType();&lt;br /&gt;&lt;br /&gt;            //Get all command methods obbeying the convention we set up for command handler methods&lt;br /&gt;            IEnumerable&amp;lt;MethodInfo&amp;gt; commandMethods = viewModelType.GetMethods()&lt;br /&gt;                .Where(method =&amp;gt; method.Name.StartsWith(COMMAND_METHOD_PREFIX))&lt;br /&gt;                .Where(method =&amp;gt; method.Name.EndsWith(COMMAND_METHOD_SUFFIX));&lt;br /&gt;&lt;br /&gt;            foreach (MethodInfo commandMethod in commandMethods)&lt;br /&gt;            {&lt;br /&gt;                //Make sure we get the right name of the method&lt;br /&gt;                int lengtOfSubString = commandMethod.Name.Length - COMMAND_METHOD_PREFIX.Length - COMMAND_METHOD_SUFFIX.Length;&lt;br /&gt;                string commandName = commandMethod.Name.Substring(COMMAND_METHOD_PREFIX.Length, lengtOfSubString);&lt;br /&gt;&lt;br /&gt;                //Get button by name&lt;br /&gt;                ButtonBase button = view.FindName(commandName) as ButtonBase;&lt;br /&gt;                if (button != null)&lt;br /&gt;                {&lt;br /&gt;                    //Set binding to reflection command&lt;br /&gt;                    button.SetBinding(ButtonBase.CommandProperty, new Binding { Source = new ReflectionCommand(commandMethod, viewModel) });&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            view.DataContext = viewModel;&lt;br /&gt;        }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;You can see that we are using a “&lt;em&gt;ReflectiveCommand&lt;/em&gt;” here,&amp;#160; this command takes the MethodInfo we have extracted from the ViewModel, and invokes it when executing the command on the ViewModel.&amp;#160; &lt;br /&gt;We are binding this directly to the Source, so we don’t have to create any properties in our ViewModel to bind to.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;public class ReflectionCommand : ICommand&lt;br /&gt;{&lt;br /&gt;        private object target;&lt;br /&gt;        private MethodInfo method;&lt;br /&gt;&lt;br /&gt;        public ReflectionCommand(MethodInfo method, object target)&lt;br /&gt;        {&lt;br /&gt;            this.method = method;&lt;br /&gt;            this.target = target;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public bool CanExecute(object parameter)&lt;br /&gt;        {&lt;br /&gt;            return true;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public event EventHandler CanExecuteChanged;&lt;br /&gt;&lt;br /&gt;        public void Execute(object parameter)&lt;br /&gt;        {&lt;br /&gt;            method.Invoke(target, new[] { parameter });&lt;br /&gt;        }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This is command is then bound to a FrameworkElement that has the same name as the Command method without it’s &lt;em&gt;PRE-&lt;/em&gt; and &lt;em&gt;SUFFIX&lt;/em&gt;. So basically for a “&lt;em&gt;Save&lt;/em&gt;” method this would be “&lt;em&gt;Execute&lt;strong&gt;Save&lt;/strong&gt;Command&lt;/em&gt;” where &lt;em&gt;Save&lt;/em&gt; would then be set as the name of the element.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml" &gt;&amp;lt;Grid x:Name=&amp;quot;LayoutRoot&amp;quot; Background=&amp;quot;White&amp;quot;&amp;gt;&lt;br /&gt;   &amp;lt;Button x:Name=&amp;quot;Save&amp;quot; Content=&amp;quot;Save&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/Grid&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Finally we would have a ViewModel that would look something like this, no more Command properties, no more RelayCommands being initialized. Just simply one public command method we can use.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;  public class ViewModel&lt;br /&gt;  {&lt;br /&gt;        public void ExecuteSaveCommand(object parameter)&lt;br /&gt;        {&lt;br /&gt;            MessageBox.Show(&amp;quot;Hello world!&amp;quot;);&lt;br /&gt;        }&lt;br /&gt;  }&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3165870666914080508-5737139451485640124?l=maartendewilde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maartendewilde.blogspot.com/feeds/5737139451485640124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maartendewilde.blogspot.com/2010/10/automatic-mvvm-command-binding.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/5737139451485640124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/5737139451485640124'/><link rel='alternate' type='text/html' href='http://maartendewilde.blogspot.com/2010/10/automatic-mvvm-command-binding.html' title='Automatic MVVM Command Binding'/><author><name>Maarten De Wilde</name><uri>http://www.blogger.com/profile/11263486577385249299</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_aTL6Htl2AhY/S7tcL0sjxCI/AAAAAAAAAAs/_QXOcUynJaE/S220/Thumb1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3165870666914080508.post-4505810016772522799</id><published>2010-06-14T12:47:00.001-07:00</published><updated>2010-06-21T13:10:59.048-07:00</updated><title type='text'>Useful Outlook Plug-in</title><content type='html'>&lt;p&gt;If you are anything like me, you will have probably sent mails referring to an attachment without actually including the attachment in this mail.&lt;/p&gt;  &lt;p&gt;So, anyone feel like this has happened to you, well here is some small tool that could prove useful.&lt;/p&gt;  &lt;p&gt;To build it just create Outlook 2007 plug-in in Visual Studio, and add the following code.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p style="line-height: normal; background: white; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;public &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;partial&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;class&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #2b91af; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;ThisAddIn        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;{&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160;&amp;#160; private&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt; Outlook.MailItem MailItem;        &lt;p&gt;&lt;/p&gt;     &lt;/span&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; background: white; mso-margin-top-alt: auto" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160;&amp;#160; private&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;void&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt; ThisAddIn_Startup(&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;object&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt; sender, System.&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #2b91af; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;EventArgs&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt; e)        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;{        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;.Application.Inspectors.NewInspector +=&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Inspectors_NewInspector;         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;}       &lt;p&gt;&lt;/p&gt;     &lt;/span&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; background: white; mso-margin-top-alt: auto" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160;&amp;#160; void&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt; Inspectors_NewInspector(Inspector inspector)        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;{        &lt;p&gt;&lt;/p&gt;     &lt;/span&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; background: white; mso-margin-top-alt: auto" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;Outlook.&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #2b91af; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;MailItem &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;mailItem = inspector.CurrentItem&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; as Outlook.&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #2b91af; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;MailItem&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;;       &lt;p&gt;&lt;/p&gt;     &lt;/span&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; background: white; mso-margin-top-alt: auto" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt; (mailItem != &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;null&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;)        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MailItem = mailItem;         &lt;p&gt;&lt;/p&gt;     &lt;/span&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; background: white; mso-margin-top-alt: auto" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt; (MailItem.EntryID == &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;null&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ((&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #2b91af; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;ItemEvents_10_Event&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;)MailItem).Send += SendMail;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;}        &lt;p&gt;&lt;/p&gt;     &lt;/span&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; background: white; mso-margin-top-alt: auto" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160;&amp;#160; private&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;void&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt; SendMail(&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;ref&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;bool&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt; cancel)        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;{        &lt;p&gt;&lt;/p&gt;     &lt;/span&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; background: white; mso-margin-top-alt: auto" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt; (MailItem.Attachments.Count == 0&amp;#160; &amp;amp;&amp;amp; (MailItem.Body.ToLower()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Contains(&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;quot;attachment&amp;quot;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;))        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160;&amp;#160; if&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt; (&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #2b91af; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;MessageBox&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;.Show(&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;quot;Are you sure you want to send this mail&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; without an attachment?&amp;quot;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;, &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;quot;Are you sure ?&amp;quot;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MessageBoxButtons.YesNo, MessageBoxIcon.Question) ==         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DialogResult.No)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cancel = &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;true&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;}&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;       &lt;p&gt;&lt;/p&gt;     &lt;/span&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; background: white; mso-margin-top-alt: auto" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160;&amp;#160; private&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;void&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt; ThisAddIn_Shutdown(&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;object&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt; sender, System.&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #2b91af; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;EventArgs&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt; e)        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;{        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;((&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #2b91af; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;ItemEvents_10_Event&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;)MailItem).Send -= SendMail;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;.Application.Inspectors.NewInspector –= Inspectors_NewInspector;       &lt;p&gt;&lt;/p&gt;     &lt;/span&gt;&lt;/p&gt;    &lt;p style="line-height: normal; background: white; mso-margin-top-alt: auto" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-ansi-language: en-us; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be" lang="EN-US"&gt;}        &lt;br /&gt;} &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #333333; font-size: 10pt; mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;; mso-fareast-language: nl-be"&gt;       &lt;p&gt;&lt;/p&gt;     &lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;       &lt;p&gt;&amp;#160;&lt;/p&gt;     &lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h4&gt;So what exactly are we doing here ? &lt;/h4&gt;  &lt;p&gt;Basically it’s simply getting an inspector for a &lt;strong&gt;MailItem&lt;/strong&gt;, and then intercepting the Send event.&lt;/p&gt;  &lt;p&gt;A send event is triggered whenever a user clicks on send while creating an email.    &lt;br /&gt;Our code will simply check if this user has mentioned an attachment in his email and ask for confirmation to send this mail without any attachments.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3165870666914080508-4505810016772522799?l=maartendewilde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maartendewilde.blogspot.com/feeds/4505810016772522799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maartendewilde.blogspot.com/2010/06/useful-outlook-plug-in.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/4505810016772522799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/4505810016772522799'/><link rel='alternate' type='text/html' href='http://maartendewilde.blogspot.com/2010/06/useful-outlook-plug-in.html' title='Useful Outlook Plug-in'/><author><name>Maarten De Wilde</name><uri>http://www.blogger.com/profile/11263486577385249299</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_aTL6Htl2AhY/S7tcL0sjxCI/AAAAAAAAAAs/_QXOcUynJaE/S220/Thumb1.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3165870666914080508.post-6558412079583414957</id><published>2010-04-01T11:33:00.000-07:00</published><updated>2010-04-01T11:33:35.109-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rx'/><category scheme='http://www.blogger.com/atom/ns#' term='Toolkit'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>Tracking events with Rx in Silverlight</title><content type='html'>&lt;p&gt;When you want to execute some code after multiple events have been completed, you don’t always know which event will be triggered first, you might have to synchronize them using some boiler plate logic.&amp;#160; This could, for example,&amp;#160; happen when you have to execute two service calls at the same time.&lt;/p&gt;  &lt;p&gt;The solution for this problem comes with the Rx framework, the &lt;em&gt;System.Reactive&lt;/em&gt; assembly found in the Silverlight Toolkit.&lt;/p&gt;  &lt;p&gt;Image you have two events coming from “&lt;u&gt;serviceProxy&lt;/u&gt;”, you could make them observable like this.&lt;/p&gt;  &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; color: #2b91af; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;IObservable&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Event&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt;&amp;gt;&amp;gt; observable1       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;= &lt;span style="color: #2b91af"&gt;Observable&lt;/span&gt;.FromEvent&amp;lt;&lt;span style="color: #2b91af"&gt;RoutedEventArgs&lt;/span&gt;&amp;gt;(serviceProxy, &lt;span style="color: #a31515"&gt;&amp;quot;EventOne&amp;quot;&lt;/span&gt;); &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; color: #2b91af; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;IObservable&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Event&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt;&amp;gt;&amp;gt; observable2       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;= &lt;span style="color: #2b91af"&gt;Observable&lt;/span&gt;.FromEvent&amp;lt;&lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt;&amp;gt;(serviceProxy, &lt;span style="color: #a31515"&gt;&amp;quot;EventTwo&amp;quot;&lt;/span&gt;); &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;You can execute the following Rx method to make sure only a composite event is triggered once &lt;u&gt;both&lt;/u&gt; events have been triggered.&amp;#160; &lt;/p&gt;  &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; color: #2b91af; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;IObservable&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Event&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt;&amp;gt;&amp;gt; joinedObservable = observable1.ForkJoin(observable2); &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;To be able to now execute our event we can simply call the &lt;em&gt;Subscribe &lt;/em&gt;method and execute a action of our choice : &lt;/p&gt;  &lt;p&gt;&lt;span style="line-height: 115%; font-family: consolas; font-size: 9.5pt; mso-ansi-language: nl-be; mso-fareast-font-family: calibri; mso-fareast-theme-font: minor-latin; mso-fareast-language: en-us; mso-bidi-language: ar-sa"&gt;joinedObservable.Subscribe( &lt;span style="color: green"&gt;/* Some Method */&lt;/span&gt; );&lt;/span&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3165870666914080508-6558412079583414957?l=maartendewilde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maartendewilde.blogspot.com/feeds/6558412079583414957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maartendewilde.blogspot.com/2010/02/tracking-events-with-rx-in-silverlight.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/6558412079583414957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/6558412079583414957'/><link rel='alternate' type='text/html' href='http://maartendewilde.blogspot.com/2010/02/tracking-events-with-rx-in-silverlight.html' title='Tracking events with Rx in Silverlight'/><author><name>Maarten De Wilde</name><uri>http://www.blogger.com/profile/11263486577385249299</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_aTL6Htl2AhY/S7tcL0sjxCI/AAAAAAAAAAs/_QXOcUynJaE/S220/Thumb1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3165870666914080508.post-3963204480546062035</id><published>2010-02-25T10:08:00.001-08:00</published><updated>2010-02-25T10:09:28.568-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Powershell'/><title type='text'>Generating GUIDs with Powershell</title><content type='html'>&lt;p&gt;Something I ran across the other day, was to use Powershell to generate a GUID.    &lt;br /&gt;This is quite useful since you’re not always working in a .NET application when you need one. And you don’t always want to compile an application to get it.&amp;#160; &lt;/p&gt;  &lt;p&gt;One way to do this, is to talk to the .NET runtime in Powershell.&amp;#160; You can simply execute the following command : &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#36aee2"&gt;[System.Guid]&lt;/font&gt;::NewGuid()&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This will generate a simple Guid, however now you will still have to copy/paste it from your command line to be able to use it.    &lt;br /&gt;It would be very handy to immediately have the Guid available in your clipboard.&lt;/p&gt;  &lt;p&gt;You can do this using the following powershell script : &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#38afe2"&gt;[reflection.assembly]&lt;/font&gt;&lt;font color="#808080"&gt;::&lt;/font&gt;LoadWithPartialName(&lt;font color="#800000"&gt;&amp;quot;System.Windows.Forms&amp;quot;&lt;/font&gt;)         &lt;br /&gt;&lt;font color="#20a6df"&gt;[System.Windows.Forms.Clipboard]&lt;/font&gt;&lt;font color="#808080"&gt;::&lt;/font&gt;SetText(&lt;font face="Courier Ne"&gt;&lt;font color="#36aee2" face="Courier New"&gt;[System.Guid]&lt;/font&gt;&lt;/font&gt;&lt;font color="#808080"&gt;::&lt;/font&gt;NewGuid().ToString())&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This script will load the the Windows Forms assembly and get the Clipboard class to use the SetText method.&amp;#160; And … magic we have the Guid in our clipboard.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3165870666914080508-3963204480546062035?l=maartendewilde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maartendewilde.blogspot.com/feeds/3963204480546062035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maartendewilde.blogspot.com/2010/02/generating-guids-with-powershell.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/3963204480546062035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/3963204480546062035'/><link rel='alternate' type='text/html' href='http://maartendewilde.blogspot.com/2010/02/generating-guids-with-powershell.html' title='Generating GUIDs with Powershell'/><author><name>Maarten De Wilde</name><uri>http://www.blogger.com/profile/11263486577385249299</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_aTL6Htl2AhY/S7tcL0sjxCI/AAAAAAAAAAs/_QXOcUynJaE/S220/Thumb1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3165870666914080508.post-5329189547654086431</id><published>2010-02-02T23:19:00.001-08:00</published><updated>2010-02-04T11:05:22.812-08:00</updated><title type='text'>Silverlight : MEF and MVVM</title><content type='html'>&lt;meta content="text/html; charset=utf-8" http-equiv="Content-Type" /&gt;&lt;meta name="ProgId" content="Word.Document" /&gt;&lt;meta name="Generator" content="Microsoft Word 11" /&gt;&lt;meta name="Originator" content="Microsoft Word 11" /&gt;&lt;link rel="File-List" href="file:///D:%5CDOCUME%7E1%5CMAARTE%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" /&gt;&lt;style&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;!--  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-parent:""; 	margin-top:0cm; 	margin-right:0cm; 	margin-bottom:9.0pt; 	margin-left:0cm; 	mso-pagination:widow-orphan; 	font-size:13.0pt; 	mso-bidi-font-size:10.0pt; 	font-family:"Times New Roman"; 	mso-fareast-font-family:"Times New Roman"; 	mso-ansi-language:FR-BE;} @page Section1 	{size:21.0cm 841.95pt; 	margin:3.0cm 70.85pt 5.0cm 3.0cm; 	mso-header-margin:53.85pt; 	mso-footer-margin:76.55pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --&gt; &lt;/style&gt;  &lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;With the upcoming release of Silverlight 4, I had a look at the &lt;b&gt;M&lt;/b&gt;anaged &lt;b&gt;E&lt;/b&gt;xtensibility &lt;b&gt;F&lt;/b&gt;ramework, since it is shipped together with Silverlight 4 once it is released.&lt;/p&gt;  &lt;h4&gt;What is MEF ?&lt;/h4&gt;  &lt;h3&gt;&lt;b&gt;&lt;span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;  &lt;p&gt;According to the codeplex project :&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;MEF provides a standard way for the host application to expose itself and consume external extensions. Extensions, by their nature, can be reused amongst different applications. However, an extension could still be implemented in a way that is application-specific. Extensions themselves can depend on one another and MEF will make sure they are wired together in the correct order (another thing you won't have to worry about).&amp;#160; &lt;br /&gt;&lt;font size="1"&gt;source : &lt;/font&gt;&lt;a title="http://mef.codeplex.com/" href="http://mef.codeplex.com/"&gt;&lt;font size="1"&gt;http://mef.codeplex.com/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p style="margin: 0cm 0cm 0pt 36pt" class="MsoNormal"&gt;&lt;span style="font-size: 12pt"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;Basically you can export members of a class, these will be viewed by MEF as &lt;i&gt;&lt;u&gt;parts&lt;/u&gt;&lt;/i&gt;, which in turn can be imported by other classes.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;When you want to import those parts to you Silverlight view you have to use, &lt;i&gt;PartInitializer&lt;/i&gt; which will satisfy all imports on the class with the exported types.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;h4&gt;MEF and MVVM&lt;/h4&gt;  &lt;p&gt;&lt;span&gt;This functionality gave me the idea to import a ViewModel to a View to there is no link between the both in either direction.&lt;span&gt; &lt;/span&gt;Allowing to easily change ViewModels and Views and reuse them.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;h5&gt;Defining the contract&lt;/h5&gt;  &lt;p&gt;&lt;span&gt;To be able to export and import our ViewModel parts, we have to define a contract for them.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;We will simply add the following empty interface that we must implement on all our ViewModels :&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt"&gt;public&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt; &lt;span style="color: blue"&gt;interface&lt;/span&gt; &lt;span style="color: rgb(43,145,175)"&gt;IViewModelBase&lt;/span&gt; { }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin-bottom: 0pt" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt"&gt;public&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: rgb(43,145,175)"&gt;ViewModel&lt;/span&gt; : &lt;span style="color: rgb(43,145,175)"&gt;IViewModelBase          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;{        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Value         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;{        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160; get          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;&amp;#160;&amp;#160; {        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return&lt;/span&gt; &lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;Some Display Value&amp;quot;&lt;/span&gt;;         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;&amp;#160;&amp;#160; }        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;}        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;}&lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;&lt;/span&gt;&lt;span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;h5&gt;Exporting our ViewModel&lt;/h5&gt;  &lt;p&gt;&lt;span&gt;The next step would be to export our ViewModel and expose it so it can be imported by our view.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;To do this we could provide a custom &lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Exports%20and%20Metadata&amp;amp;referringTitle=Guide"&gt;MetaModel&lt;/a&gt; &lt;/b&gt;class to make sure we can differentiate our ViewModels when assigning them to our View, however since we are only interested in a single identifier, we can create a custom export attribute to automatically do this.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;To do this we first create a contract that will be implemented as the MetaData.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0pt" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p style="margin-bottom: 0pt" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt"&gt;public&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt; &lt;span style="color: blue"&gt;interface&lt;/span&gt; &lt;span style="color: rgb(43,145,175)"&gt;IViewModelMetaData&lt;/span&gt;         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;{        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt; Identifier { &lt;span style="color: blue"&gt;get&lt;/span&gt;; }         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;}&lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;Next we will create our custom export attribute, we should make sure we inherit the original &lt;b&gt;ExportAttribute&lt;/b&gt; and mark the class as metadata so the metadata contract can be interpreted when we are importing.&lt;/p&gt;  &lt;p style="margin-bottom: 0pt" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p style="margin-bottom: 0pt" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;[&lt;span style="color: rgb(43,145,175)"&gt;MetadataAttribute&lt;/span&gt;]         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;[&lt;span style="color: rgb(43,145,175)"&gt;AttributeUsage&lt;/span&gt;(&lt;span style="color: rgb(43,145,175)"&gt;AttributeTargets&lt;/span&gt;.Class, AllowMultiple = &lt;span style="color: blue"&gt;false&lt;/span&gt;)]         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt"&gt;public&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: rgb(43,145,175)"&gt;ViewModelExportAttribute&lt;/span&gt; : &lt;span style="color: rgb(43,145,175)"&gt;ExportAttribute&lt;/span&gt;, &lt;span style="color: rgb(43,145,175)"&gt;IViewModelMetaData          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;{        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; ViewModelExportAttribute()&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;: &lt;span style="color: blue"&gt;base&lt;/span&gt;(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: rgb(43,145,175)"&gt;IViewModelBase&lt;/span&gt;))         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;{&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin-bottom: 0pt" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;&lt;span&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Identifier { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;}&lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;We c&lt;/span&gt;&lt;span lang="EN-GB"&gt;an apply this to our ViewModel by adding the following attribute above the class definition.&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;[&lt;span style="color: rgb(43,145,175)"&gt;ViewModelExport&lt;/span&gt;(Identifier = &lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;MyViewModelIdentifier&amp;quot;&lt;/span&gt;)]&lt;/p&gt; &lt;/blockquote&gt;  &lt;h5&gt;&lt;/h5&gt; &lt;o:p&gt;&lt;/o:p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;h5&gt;&lt;span&gt;Importing the ViewModel&lt;/span&gt;&lt;/h5&gt;  &lt;p&gt;&lt;span&gt;At this point we want to be able to link the exported ViewModel to our View, to do this we can create a abstract class we can use as a base for all our views, implementing some basic functionality to enable the import.&lt;/span&gt;&lt;/p&gt;  &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;/p&gt;  &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;public&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ViewBase&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;UserControl&lt;/span&gt;         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;{&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;protected&lt;/span&gt; ViewBase()&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;{&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;PartInitializer.SatisfyImports(&lt;span style="color: blue"&gt;this&lt;/span&gt;);&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;} &lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; ViewModelIdentifier { &lt;span style="color: blue"&gt;get&lt;/span&gt;; } &lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;[&lt;span style="color: #2b91af"&gt;ImportMany&lt;/span&gt;]&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Lazy&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;IViewModelBase&lt;/span&gt;,&lt;span style="color: #2b91af"&gt;IViewModelMetaData&lt;/span&gt;&amp;gt;[] ViewDataContext&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;{&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;set&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;DataContext = &lt;span style="color: blue"&gt;value          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Where(viewModel =&amp;gt; viewModel.Metadata.Identifier == ViewModelIdentifier)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .First().Value;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;} &lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;So what exactly did we do here ?&amp;#160;&amp;#160; To start ,we have created a ViewDataContext property of type Lazy&amp;lt;IViewModelBase,IViewModelData&amp;gt; and marked it with the ImportMany attribute.&lt;/p&gt;  &lt;p&gt;Once the &lt;em&gt;StatisfyImports&lt;/em&gt; method is called, MEF will initialize all properties marked with the Import attribute, in our case it will initialize the ‘ViewDataContext’ property.&amp;#160; Since MEF will import all Parts of the given IViewModelBase contract, we need a way to identify which ViewModel we want to use on our View, we can do this by exposing an abstract property ‘ViewModelIdentifier’ that will have to implemented by all views.&amp;#160; &lt;/p&gt;  &lt;p&gt;Doing this we can check the exported metadata for the Identifier and compare it to the ViewModelIdentifier defined in the view, when a match has been found, the ViewModel is assigned to the DataContext of the view and we can do all the usual MVVM magic. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3165870666914080508-5329189547654086431?l=maartendewilde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maartendewilde.blogspot.com/feeds/5329189547654086431/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maartendewilde.blogspot.com/2010/02/silverlight-mef-and-mvvm.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/5329189547654086431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/5329189547654086431'/><link rel='alternate' type='text/html' href='http://maartendewilde.blogspot.com/2010/02/silverlight-mef-and-mvvm.html' title='Silverlight : MEF and MVVM'/><author><name>Maarten De Wilde</name><uri>http://www.blogger.com/profile/11263486577385249299</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_aTL6Htl2AhY/S7tcL0sjxCI/AAAAAAAAAAs/_QXOcUynJaE/S220/Thumb1.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3165870666914080508.post-3418056850583267316</id><published>2009-12-28T02:50:00.001-08:00</published><updated>2010-01-06T13:22:44.520-08:00</updated><title type='text'>Creating a simple Commanding Framework for Silverlight 3</title><content type='html'>&lt;p&gt;Whenever you are working with commanding, you are dependent on using either PRISM or perhaps the Interactivity framework. ( see my previous post )&lt;/p&gt;  &lt;p&gt;Even in the future when Silverlight 4 is released there will only be support for commanding on Buttons and Hyperlinks.&amp;#160; So you might consider writing your own framework to handle all these things for you and allowing you to add some functionality on the way.&lt;/p&gt;  &lt;h5&gt;Getting Started&lt;/h5&gt;  &lt;p&gt;By default, Silverlight provides an ICommand interface that already provides you with a basic contract to get started with Commanding.&amp;#160; What we are going to do is extend this interface in an &lt;strong&gt;ITriggeredCommand&lt;/strong&gt; interface. This will allow us to hook up some event handler when we want to execute the command.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;public&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt; &lt;span style="color: blue"&gt;interface&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ITriggeredCommand&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;ICommand          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;{&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt; Trigger { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt"&gt;}&lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h4&gt;&lt;span style="font-family: consolas; font-size: 9.5pt"&gt;&lt;/span&gt;&lt;/h4&gt;  &lt;h4&gt;&lt;/h4&gt;  &lt;h5&gt;Setting up the Framework&lt;/h5&gt;  &lt;h4&gt;&lt;/h4&gt;  &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;Next we will create an abstract implementation to hide some of the contract from the ICommand and create our own contract.&amp;#160; We will however expose the possibility to invoke the CanExecuteChanged event, to be able to adapt our interface in the way we desire.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;public&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;BaseCommand&lt;/span&gt;&amp;lt;T&amp;gt; : &lt;span style="color: #2b91af"&gt;ITriggeredCommand          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;{&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Trigger { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;#160; &lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Action&lt;/span&gt;&amp;lt;T&amp;gt; execute;         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style="color: #2b91af"&gt;Boolean&lt;/span&gt;&amp;gt; canExecute;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;#160; &lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; BaseCommand(&lt;span style="color: #2b91af"&gt;Action&lt;/span&gt;&amp;lt;T&amp;gt; execute, &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style="color: #2b91af"&gt;Boolean&lt;/span&gt;&amp;gt; canExecute)         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt;(execute == &lt;span style="color: blue"&gt;null&lt;/span&gt;)         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;The execution action cannot be null.&amp;quot;&lt;/span&gt;);         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;this&lt;/span&gt;.execute = execute;         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;this&lt;/span&gt;.canExecute = canExecute;         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;#160; &lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; When we have a canExecute function, execute it and pass the result          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; CanExecute(&lt;span style="color: blue"&gt;object&lt;/span&gt; parameter)         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (canExecute != &lt;span style="color: blue"&gt;null&lt;/span&gt;)         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; canExecute((T)parameter);         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;true&lt;/span&gt;;         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;#160; &lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Execute the execution action, passing the parameter          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Execute(&lt;span style="color: blue"&gt;object&lt;/span&gt; parameter)         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;execute((T)parameter);         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Allow for an implementation of this abstract class to invoke the CanExecuteChanged event          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; InvokeCanExecuteChanged()         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (CanExecuteChanged != &lt;span style="color: blue"&gt;null&lt;/span&gt;)         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;CanExecuteChanged(&lt;span style="color: blue"&gt;this&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt;.Empty);         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;#160; &lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;event&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt; CanExecuteChanged;         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt"&gt;}&lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;At this point you should write a custom implementation of the BaseCommand&amp;lt;T&amp;gt;, however I will now continue with describing how we can hook this functionality up with our UI and ultimately allow you to use it in an MVVM application.&lt;/p&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;h5&gt;Making it work&lt;/h5&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;p&gt;So how do we hook up the commands to our UI,&amp;#160; well for this we can use attached properties and databind our commands to them accordingly. &lt;/p&gt;  &lt;p&gt;The following code listing will describe how we can make sure the correct event is triggered ( the Trigger property ).&lt;/p&gt;  &lt;blockquote&gt;   &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; color: blue; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;public&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Commands          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;{        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Register the new attached property for a command          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DependencyProperty&lt;/span&gt; CommandProperty = &lt;span style="color: #2b91af"&gt;DependencyProperty&lt;/span&gt;.RegisterAttached         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #a31515"&gt;&amp;quot;Command&amp;quot;&lt;/span&gt;,         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;ITriggeredCommand&lt;/span&gt;),         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Commands&lt;/span&gt;),         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PropertyMetadata&lt;/span&gt;(commandChanged)         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;);&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;#160;&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; SetCommand(&lt;span style="color: #2b91af"&gt;DependencyObject&lt;/span&gt; obj, &lt;span style="color: #2b91af"&gt;ITriggeredCommand&lt;/span&gt; propertyValue)         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;obj.SetValue(CommandProperty, propertyValue);         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;}&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ITriggeredCommand&lt;/span&gt; GetCommand(&lt;span style="color: #2b91af"&gt;DependencyObject&lt;/span&gt; obj)         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;ITriggeredCommand&lt;/span&gt;)obj.GetValue(CommandProperty);         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;}&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: green"&gt;//When the command changed make sure it is handled correctly&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; commandChanged(&lt;span style="color: #2b91af"&gt;DependencyObject&lt;/span&gt; obj, &lt;span style="color: #2b91af"&gt;DependencyPropertyChangedEventArgs&lt;/span&gt; arguments)         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (arguments.NewValue &lt;span style="color: blue"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ITriggeredCommand&lt;/span&gt;)         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&lt;/span&gt;{         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ITriggeredCommand&lt;/span&gt; command = (&lt;span style="color: #2b91af"&gt;ITriggeredCommand&lt;/span&gt;)arguments.NewValue;         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: green"&gt;//Get the event that is related to the trigger          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EventInfo&lt;/span&gt; evInfo = obj.GetType().GetEvent(command.Trigger);         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: green"&gt;//Create an eventhandler delegate for it          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Delegate&lt;/span&gt; executeEventDelegate = &lt;span style="color: #2b91af"&gt;Delegate&lt;/span&gt;.CreateDelegate         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;(         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;evInfo.EventHandlerType,         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;null&lt;/span&gt;,         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Commands&lt;/span&gt;).GetMethod(&lt;span style="color: #a31515"&gt;&amp;quot;handler&amp;quot;&lt;/span&gt;,&lt;span style="color: #2b91af"&gt;BindingFlags&lt;/span&gt;.Static | &lt;span style="color: #2b91af"&gt;BindingFlags&lt;/span&gt;.NonPublic)         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;);         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: green"&gt;//Assign the Event handler to the object          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;evInfo.AddEventHandler(obj,executeEventDelegate);&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: green"&gt;//Execute the command          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; handler(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; args)         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ITriggeredCommand&lt;/span&gt; command = GetCommand((&lt;span style="color: #2b91af"&gt;DependencyObject&lt;/span&gt;)sender);         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: green"&gt;//We could implement an additional attached property to allow for a parameter to be set          &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (command.CanExecute(&lt;span style="color: blue"&gt;null&lt;/span&gt;))         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;command.Execute(&lt;span style="color: blue"&gt;null&lt;/span&gt;);         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt"&gt;}        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 8pt"&gt;} &lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The important thing here is that we able to attach our command to an event that is related to the object we are binding our command to.&amp;#160; &lt;/p&gt;  &lt;p&gt;In the &lt;strong&gt;commandChanged&lt;/strong&gt; method we subscribe our handler to our event using reflection based on the EventHandlerType that was provided by the event defined in the Trigger property.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3165870666914080508-3418056850583267316?l=maartendewilde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maartendewilde.blogspot.com/feeds/3418056850583267316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maartendewilde.blogspot.com/2009/12/creating-simple-commanding-framework.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/3418056850583267316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/3418056850583267316'/><link rel='alternate' type='text/html' href='http://maartendewilde.blogspot.com/2009/12/creating-simple-commanding-framework.html' title='Creating a simple Commanding Framework for Silverlight 3'/><author><name>Maarten De Wilde</name><uri>http://www.blogger.com/profile/11263486577385249299</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_aTL6Htl2AhY/S7tcL0sjxCI/AAAAAAAAAAs/_QXOcUynJaE/S220/Thumb1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3165870666914080508.post-6493020551072179447</id><published>2009-12-01T11:02:00.001-08:00</published><updated>2009-12-02T10:03:39.611-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PRISM'/><category scheme='http://www.blogger.com/atom/ns#' term='MVVM'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>Creating a basic MVVM Application</title><content type='html'>&lt;p&gt;In one of my previous post I mentioned MVVM ( or Model-View-ViewModel ) , so what exactly is the idea behind it, and more importantly, what are the advantages?&lt;/p&gt;  &lt;h5&gt;Separating UI from Business logic&lt;/h5&gt;  &lt;p&gt;The main problem with a Silverlight application is that you have a whole bunch of UI code intermingled with a bunch of Business logic.&amp;#160; This makes the whole application hard to understand, hard to debug and hard to test. We would like to have a way to avoid this.&amp;#160; &lt;/p&gt;  &lt;p&gt;A solution to this problem is the concept of databinding in Silverlight, this allows us to loosely couple business Logic ( &lt;strong&gt;ViewModel&lt;/strong&gt; )to our UI ( &lt;strong&gt;View&lt;/strong&gt; ) and display the data we want ( &lt;strong&gt;Model&lt;/strong&gt; ).&lt;/p&gt;  &lt;p&gt;To allow interaction with our ViewModel, we would also require some functionalities to be bound to some UI components such as buttons.&amp;#160; For this we can use &lt;strong&gt;Commands,&lt;/strong&gt;&amp;#160; Silverlight 3 provides by default the ICommand interface, and the PRISM framework has made an implementation of this so we can define commands on our &lt;em&gt;FrameworkElement&lt;/em&gt; using attached properties.&amp;#160; &lt;/p&gt;  &lt;p&gt;In &lt;em&gt;Silverlight 4&lt;/em&gt; there will be support for Commands out of the box for the &lt;strong&gt;ButtonBase&lt;/strong&gt; and &lt;strong&gt;Hyperlink&lt;/strong&gt; classes, so we will simply be able to bind to the Command property directly.&lt;/p&gt;  &lt;h5&gt;Setting it up&lt;/h5&gt;  &lt;p&gt;To make a MVVM application we will have to define a View and a ViewModel, a practice I like to use is to create two folders in our application to group our View’s and ViewModel’s so we have a clear view were our UI and our business logic is located.&lt;/p&gt;  &lt;p&gt;As an example we will create a simple UI with a listbox and a button that will add quotes to it and display the data when the last quote was added.&lt;/p&gt;  &lt;p&gt;The XAML for this view is straightforward :&lt;/p&gt;  &lt;blockquote&gt;   &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;StackPanel&lt;/span&gt;&lt;span style="font-family: consolas; color: red; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt; Orientation&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;=&amp;quot;Vertical&amp;quot;&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;ListBox&lt;/span&gt;&lt;span style="font-family: consolas; color: red; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt; Height&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;=&amp;quot;150&amp;quot;/&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;TextBlock&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt; /&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;Button&lt;/span&gt;&lt;span style="font-family: consolas; color: red; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt; Content&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;=&amp;quot;Add Quote&amp;quot;/&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; font-size: 9.5pt"&gt;StackPanel&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt"&gt;&amp;gt; &lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Notice that I have not yet defined any databinding here, we will first create our ViewModel and map our binding to this afterwards.&lt;/p&gt;  &lt;p&gt;A ViewModel that wants changes in it to be propagated to the UI should implement &lt;strong&gt;INotifyPropertyChanged&lt;/strong&gt; this will provide a NotifyPropertyChanged event that will have to be invoked whenever a property in our ViewModel changes.&amp;#160; We will use an ObservableCollection to bind our quotes, to automatically trigger changes when we add new quotes.&lt;/p&gt;  &lt;p&gt;This is the code for our ViewModel&lt;/p&gt;  &lt;blockquote&gt;   &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;public&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ViewModel&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;INotifyPropertyChanged&lt;/span&gt;         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;{&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; ViewModel()&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: green"&gt;//Initialize our properties&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;Quotes = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ObservableCollection&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;AddQuoteCommand = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DelegateCommand&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&amp;gt;(onAddQuoteCommandExecute);&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;} &lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Command that will be triggered when a button was clicked and will add a quote to the Quotes collection&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DelegateCommand&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&amp;gt; AddQuoteCommand { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; } &lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; The list of Quotes we will bind to our listbox&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ObservableCollection&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;String&lt;/span&gt;&amp;gt; Quotes { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; } &lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt; lastModified;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; When was the list last modified&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt; LastModified&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; lastModified; }         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;set&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;lastModified = &lt;span style="color: blue"&gt;value&lt;/span&gt;;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;InvokePropertyChanged(&lt;span style="color: #a31515"&gt;&amp;quot;LastModified&amp;quot;&lt;/span&gt;);&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;} &lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; When the AddQuoteCommand is triggered, it execute run this method&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; onAddQuoteCommandExecute(&lt;span style="color: blue"&gt;object&lt;/span&gt; parameter)&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: green"&gt;//Add a generated quote&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;Quotes.Add(&lt;span style="color: #2b91af"&gt;QuoteFactory&lt;/span&gt;.Generate());         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: green"&gt;//Set the last modified date&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;LastModified = &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;} &lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;event&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PropertyChangedEventHandler&lt;/span&gt; PropertyChanged;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Invoke that a property was changed&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;param name=&amp;quot;propertyName&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;The propertyname&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; InvokePropertyChanged(&lt;span style="color: blue"&gt;string&lt;/span&gt; propertyName)&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (PropertyChanged != &lt;span style="color: blue"&gt;null&lt;/span&gt;)         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PropertyChanged(&lt;span style="color: blue"&gt;this&lt;/span&gt;, &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PropertyChangedEventArgs&lt;/span&gt;(propertyName));&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;} &lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;} &lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Now we can start binding our ViewModel to our View, there are a few ways you could to this, you could set the DataContext of the View in Code, or use dependency injection to initialize the ViewModel.&amp;#160; But for this example I will just define an instance of the ViewModel in the XAML of the View in its DataContext. Now we can simple add the databinding to our ListBox ,our TextBlock and bind the Command to the Button.&amp;#160; Silverlight will take care of the rest.&amp;#160; &lt;/p&gt;  &lt;blockquote&gt;   &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;ListBox&lt;/span&gt;&lt;span style="font-family: consolas; color: red; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt; Height&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;=&amp;quot;150&amp;quot;&lt;/span&gt;&lt;span style="font-family: consolas; color: red; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt; ItemsSource&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;Binding&lt;/span&gt;&lt;span style="font-family: consolas; color: red; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt; Quotes&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;}&amp;quot;/&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;TextBlock&lt;/span&gt;&lt;span style="font-family: consolas; color: red; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt; Text&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;Binding&lt;/span&gt;&lt;span style="font-family: consolas; color: red; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt; LastModified&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;}&amp;quot; /&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;Button&lt;/span&gt;&lt;span style="font-family: consolas; color: red; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt; Content&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;=&amp;quot;Add Quote&amp;quot;&lt;/span&gt;&lt;span style="font-family: consolas; color: red; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt; Commands&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;:&lt;/span&gt;&lt;span style="font-family: consolas; color: red; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;Click.Command&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="font-family: consolas; color: #a31515; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;Binding&lt;/span&gt;&lt;span style="font-family: consolas; color: red; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt; AddQuoteCommand&lt;/span&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9.5pt; mso-ansi-language: en-us" lang="EN-US"&gt;}&amp;quot;/&amp;gt; &lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h5&gt;Conclusion&lt;/h5&gt;  &lt;p&gt;This example illustrates that setting up MVVM is not very difficult and allows for a nice separation of UI code and business logic.&amp;#160; You can, using MVVM, very easily define logic on several controls without having to write spaghetti code with events.&amp;#160; You would simply bind to the changing property in the UI ( e.g. a checkbox that is checked ) and have your View adapt to it accordingly because the setter in the ViewModel can very easily trigger business logic to occur. &lt;/p&gt;  &lt;p&gt;There are however cases where you cannot, or very difficultly, achieve this.&amp;#160; You can not, for example, bind to a DependencyObject ( which is possible in WPF ). This will throw a XAML error in Silverlight 3.&amp;#160; However, in Silverlight 4 it will be possible to bind to a DependencyObject, making life a bit easier for people implementing MVVM.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3165870666914080508-6493020551072179447?l=maartendewilde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maartendewilde.blogspot.com/feeds/6493020551072179447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maartendewilde.blogspot.com/2009/12/creating-basic-mvvm-application.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/6493020551072179447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/6493020551072179447'/><link rel='alternate' type='text/html' href='http://maartendewilde.blogspot.com/2009/12/creating-basic-mvvm-application.html' title='Creating a basic MVVM Application'/><author><name>Maarten De Wilde</name><uri>http://www.blogger.com/profile/11263486577385249299</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_aTL6Htl2AhY/S7tcL0sjxCI/AAAAAAAAAAs/_QXOcUynJaE/S220/Thumb1.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3165870666914080508.post-3979919973011326852</id><published>2009-11-18T13:16:00.001-08:00</published><updated>2009-11-18T13:16:32.533-08:00</updated><title type='text'>Silverlight 4 BETA – A first look</title><content type='html'>&lt;p&gt;Today Silverlight 4 beta was released !!&lt;/p&gt;  &lt;p&gt;New with Silverlight 4 is a lot of features, a whole list of new stuff has been released, many of which are things I was really looking forward to ( native support for commands, binding on dependency objects, right clicking,text trimming , …).&lt;/p&gt;  &lt;p&gt;So what are all the new features in Silverlight, well there is a whole list that can be found on the Blog of Tim Heuer.&lt;/p&gt;  &lt;p&gt;&lt;a title="http://timheuer.com/blog/archive/2009/11/18/whats-new-in-silverlight-4-complete-guide-new-features.aspx" href="http://timheuer.com/blog/archive/2009/11/18/whats-new-in-silverlight-4-complete-guide-new-features.aspx"&gt;http://timheuer.com/blog/archive/2009/11/18/whats-new-in-silverlight-4-complete-guide-new-features.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You can expect a number of posts on Silverlight 4 in the coming days, as I am exploring this new version.&lt;/p&gt;  &lt;p&gt;Exiting stuff !&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3165870666914080508-3979919973011326852?l=maartendewilde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maartendewilde.blogspot.com/feeds/3979919973011326852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maartendewilde.blogspot.com/2009/11/silverlight-4-beta-first-look.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/3979919973011326852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/3979919973011326852'/><link rel='alternate' type='text/html' href='http://maartendewilde.blogspot.com/2009/11/silverlight-4-beta-first-look.html' title='Silverlight 4 BETA – A first look'/><author><name>Maarten De Wilde</name><uri>http://www.blogger.com/profile/11263486577385249299</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_aTL6Htl2AhY/S7tcL0sjxCI/AAAAAAAAAAs/_QXOcUynJaE/S220/Thumb1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3165870666914080508.post-401810884673469134</id><published>2009-11-16T11:43:00.001-08:00</published><updated>2009-11-17T09:52:28.551-08:00</updated><title type='text'>Commanding with PRISM in Silverlight 3</title><content type='html'>&lt;p align="justify"&gt;You have probably already heard about PRISM, but in case you, like me, have not really looked at it I thought I would write a small intro to using commands in PRISM. &lt;/p&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;h5&gt;What is PRISM ? &lt;/h5&gt;  &lt;blockquote&gt;   &lt;p&gt;The Composite Client Application Guidance is designed to help you more easily build modular Windows Presentation Foundation (WPF) and Silverlight client applications. These types of applications typically feature multiple screens, rich, flexible user interaction and data visualization, and role-determined behavior. They are &amp;quot;built to last&amp;quot; and &amp;quot;built for change.&amp;quot;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p align="right"&gt;&lt;strong&gt;&lt;font size="1"&gt;Source : &lt;/font&gt;&lt;a title="http://www.codeplex.com/CompositeWPF/" href="http://www.codeplex.com/CompositeWPF/"&gt;&lt;font size="1"&gt;http://www.codeplex.com/CompositeWPF/&lt;/font&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Prism is a much broader field then just commanding, and I will spend a few future blogpost in explaining it a bit more in detail, but for now I am just going to talk about using Commands.&amp;#160; Why, could you ask, well the main reason is that this is the biggest thing I was missing in Silverlight, a way to define ( in XAML ) how we want our UI to behave without having to attach unreadable event handlers like we would normally do.&lt;/p&gt;  &lt;p&gt;For a detailed explanation on how commanding works you could visit the &lt;a href="http://msdn.microsoft.com/en-us/library/dd458928.aspx"&gt;msdn&lt;/a&gt; website, but for a simple, back to basics solution, please read on.&lt;/p&gt;  &lt;h5&gt;MVVM&lt;/h5&gt;  &lt;p&gt;To illustrate our point we are going to create an MVVM application, what MVVM is and how we should work with it is something we will talk about in one of my next posts.&amp;#160; The think here is that we will not have any code behind in our View ( Page ) and we will databind our ViewModel to it to be able to do some commanding.&lt;/p&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;h5&gt;The XAML code :&lt;/h5&gt;  &lt;p&gt;This is the xaml code we will place in our view class, for example “MainPage.xaml”, the code behind will be empty, appart from the standard InitializeComponent() call.&lt;/p&gt;  &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;UserControl.DataContext&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;local&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;:&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;ViewModel&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;/&amp;gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;UserControl.DataContext&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Grid&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; x&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;:&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Name&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;=&amp;quot;LayoutRoot&amp;quot;&amp;gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;StackPanel&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; Orientation&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;=&amp;quot;Vertical&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;TextBlock&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; Text&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;=&amp;quot;Please enter the answer : &amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;TextBox&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; Text&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Binding&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; TextValue&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;}&amp;quot;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; x&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;:&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Name&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;=&amp;quot;answer&amp;quot;/&amp;gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Button&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; Content&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;=&amp;quot;Ok&amp;quot;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; composite&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;:&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Click.Command&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Binding&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; ConfirmCommand&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;}&amp;quot;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: red"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; composite&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Click.CommandParameter&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding&lt;/span&gt;&lt;span style="color: red"&gt; ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=answer,        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Text}&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&lt;/span&gt;/&amp;gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 10pt; mso-no-proof: yes"&gt;&amp;lt;StackPanel&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-no-proof: yes"&gt;&amp;gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 10pt; mso-no-proof: yes"&gt;Grid&lt;/span&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;h5&gt;The ViewModel&lt;/h5&gt;  &lt;p&gt;This is the ViewModel, this is a concept that I will explain in further detail in future posts, but the idea is that this ViewModel is databound to the View ( as we can see in the DataContext property in the View )&lt;/p&gt;  &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;public&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ViewModel&lt;/span&gt; : INotifyPropertyChanged       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; ViewModel()       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: green"&gt;//Initialize the command, hooking up the execute method and the canexecute method&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;ConfirmCommand = &lt;span style="color: blue"&gt;new&lt;/span&gt; DelegateCommand&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;(execute, canExecute);       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;} &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Execute the command when it was clicked        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;param name=&amp;quot;parameter&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;The Command Parameter that was given&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; execute(&lt;span style="color: blue"&gt;string&lt;/span&gt; parameter)&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;MessageBox.Show(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;You have succesfully answered : {0}&amp;quot;&lt;/span&gt;, parameter));&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;/span&gt;}&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: gray"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Can we execute the command, this will disable the related control if it cannot        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;param name=&amp;quot;parameter&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;The command parameter that was given&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;Can the command execute&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/returns&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; canExecute(&lt;span style="color: blue"&gt;string&lt;/span&gt; parameter)       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: green"&gt;//Can we execute the command        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; parameter == &lt;span style="color: #a31515"&gt;&amp;quot;42&amp;quot;&lt;/span&gt;;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;}      &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; textValue;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Definition of our bindeable TextValue, with a trigger to update the UI        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: gray"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; TextValue       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; textValue; }       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;set &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;       &lt;br /&gt;&lt;/span&gt;{       &lt;br /&gt;&amp;#160; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;textValue = &lt;span style="color: blue"&gt;value&lt;/span&gt;;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: green"&gt;&amp;#160; //Notifiy the property has changed        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;#160; InvokePropertyChanged(&lt;span style="color: #a31515"&gt;&amp;quot;TextValue&amp;quot;&lt;/span&gt;);       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: green"&gt;&amp;#160; //Notify the command that the conditions to execute have changed        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;#160; ConfirmCommand.RaiseCanExecuteChanged();      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;}      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;}      &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; DelegateCommand&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; ConfirmCommand { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&amp;#160; &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Track changes to the Properties, so the UI can know when to update the bindings.        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;/span&gt;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: gray"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;event&lt;/span&gt; PropertyChangedEventHandler PropertyChanged;       &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; InvokePropertyChanged(&lt;span style="color: blue"&gt;string&lt;/span&gt; property)&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{      &lt;br /&gt;&amp;#160;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (PropertyChanged != &lt;span style="color: blue"&gt;null&lt;/span&gt;)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;PropertyChanged(&lt;span style="color: blue"&gt;this&lt;/span&gt;, &lt;span style="color: blue"&gt;new&lt;/span&gt; PropertyChangedEventArgs(property));       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-no-proof: yes"&gt;}      &lt;br /&gt;&lt;/span&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt; mso-no-proof: yes"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;So what exactly does this application do ?&amp;#160; Well basically it check if your entered text in a textbox is equal to “42” and enables the Button if so.&amp;#160; Nothing to complicated, just the answer to life the universe and everything (&lt;a href="http://en.wikipedia.org/wiki/Phrases_from_The_Hitchhiker%27s_Guide_to_the_Galaxy"&gt;link&lt;/a&gt;).&lt;/p&gt;  &lt;h5&gt;Conclusion&lt;/h5&gt;  &lt;p&gt;I hope it is clear by this example what power Commanding has in Silverlight ( just like in WPF ) and how we can benefit from using it more extensively. Mainly the &lt;strong&gt;&lt;em&gt;&lt;u&gt;CanExecute&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt; makes a huge difference in how you can easily allow an application to respond to your input and adapt.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3165870666914080508-401810884673469134?l=maartendewilde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maartendewilde.blogspot.com/feeds/401810884673469134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maartendewilde.blogspot.com/2009/11/commanding-with-prism-in-silverlight-3.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/401810884673469134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/401810884673469134'/><link rel='alternate' type='text/html' href='http://maartendewilde.blogspot.com/2009/11/commanding-with-prism-in-silverlight-3.html' title='Commanding with PRISM in Silverlight 3'/><author><name>Maarten De Wilde</name><uri>http://www.blogger.com/profile/11263486577385249299</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_aTL6Htl2AhY/S7tcL0sjxCI/AAAAAAAAAAs/_QXOcUynJaE/S220/Thumb1.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3165870666914080508.post-2360771007631403759</id><published>2009-11-07T01:23:00.000-08:00</published><updated>2009-11-10T09:53:57.922-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rx'/><category scheme='http://www.blogger.com/atom/ns#' term='Toolkit'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>Silverlight Rx : System.Reactive</title><content type='html'>&lt;p&gt;Yesterday I came across the System.Reactive assembly that is included with the &lt;a href="http://www.codeplex.com/Silverlight"&gt;Silverlight Toolkit.&lt;/a&gt;&amp;#160; On the blog of Jafar Husain&lt;/p&gt;  &lt;p&gt;He has made a lot of posts about the Rx framework, and it is definitely interesting to read!&lt;/p&gt;  &lt;p&gt;&lt;a title="http://themechanicalbride.blogspot.com/2009/07/introducing-rx-linq-to-events.html" href="http://themechanicalbride.blogspot.com/2009/07/introducing-rx-linq-to-events.html"&gt;http://themechanicalbride.blogspot.com/2009/07/introducing-rx-linq-to-events.html&lt;/a&gt;     &lt;br /&gt;    &lt;br /&gt;We can program in reaction to events and apply our logic on them. We could for example do some action only when an event is raised with a certain event argument. This embeds the Async handling of events and allows this code to be &lt;em&gt;unit tested&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;The big problem with asynchronous programming is that the code very quickly gets unreadable and hard to maintain, as it is not always clear how several events are linked to one another.&lt;/p&gt;  &lt;p&gt;The Reactive framework works with the &lt;em&gt;&lt;strong&gt;IObserver&lt;/strong&gt;&lt;/em&gt; and the &lt;strong&gt;&lt;em&gt;IObservable&lt;/em&gt;&lt;/strong&gt; classes, which can be thought of as Reactive versions of &lt;strong&gt;&lt;em&gt;IEnumerable&lt;/em&gt;&lt;/strong&gt; in the context of &lt;strong&gt;&lt;em&gt;Linq&lt;/em&gt;&lt;/strong&gt; ( actually the extension methods have been added to the &lt;em&gt;System.Linq &lt;/em&gt;namespace ).&amp;#160; You basically look at the events being thrown as a collection you can browse trough.&lt;/p&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;h5&gt;So how does it work.&lt;/h5&gt;  &lt;p&gt;To quickly show how we can use Rx to simplify our code, We will write an extension method that will call a web client's DownloadString method and return a String.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;public&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;WebClientExtender        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{ &lt;/span&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IObservable&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; GetSite(&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 10pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;this&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt; &lt;span style="color: #2b91af"&gt;WebClient&lt;/span&gt; client, &lt;span style="color: blue"&gt;string&lt;/span&gt; url)         &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{        &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span lang="EN-US" style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; downloaded = &lt;span style="color: #2b91af"&gt;Observable&lt;/span&gt;.FromEvent&amp;lt;&lt;span style="color: #2b91af"&gt;DownloadStringCompletedEventArgs&lt;/span&gt;&amp;gt;           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (client, &lt;span style="color: #a31515"&gt;&amp;quot;DownloadStringCompleted&amp;quot;&lt;/span&gt;);           &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;client.DownloadStringAsync(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;(url));           &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; downloaded.Select(x=&amp;gt;((&lt;span style="color: #2b91af"&gt;DownloadStringCompletedEventArgs&lt;/span&gt;)x.EventArgs).Result);           &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;} &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt; &lt;span lang="EN-US" style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;     &lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;/p&gt;      &lt;p&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;}&lt;/span&gt;&lt;/p&gt;      &lt;p&gt;&lt;font face="tRE"&gt;&lt;strong&gt;To call this we can now simple add the following line of code to our Silverlight application.&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;   &lt;/span&gt;    &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-size: 10pt; color: blue; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;new&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 10pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt; &lt;span style="color: #2b91af"&gt;WebClient&lt;/span&gt;().GetSite(&lt;span style="color: #a31515"&gt;&amp;quot;http://localhost/&amp;quot;&lt;/span&gt;).Subscribe(x =&amp;gt; &lt;span style="color: #2b91af"&gt;MessageBox&lt;/span&gt;.Show(x));&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;/p&gt;    &lt;h5&gt;&lt;font face="Tre"&gt;&lt;/font&gt;&lt;/h5&gt;    &lt;p&gt;&lt;/p&gt; This way we can very easily clean up the code and structure how the Asynchronous events are handled.&lt;/span&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3165870666914080508-2360771007631403759?l=maartendewilde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maartendewilde.blogspot.com/feeds/2360771007631403759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maartendewilde.blogspot.com/2009/11/silverlight-rx-systemreactive.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/2360771007631403759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/2360771007631403759'/><link rel='alternate' type='text/html' href='http://maartendewilde.blogspot.com/2009/11/silverlight-rx-systemreactive.html' title='Silverlight Rx : System.Reactive'/><author><name>Maarten De Wilde</name><uri>http://www.blogger.com/profile/11263486577385249299</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_aTL6Htl2AhY/S7tcL0sjxCI/AAAAAAAAAAs/_QXOcUynJaE/S220/Thumb1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3165870666914080508.post-5330397050950806567</id><published>2009-11-01T10:52:00.001-08:00</published><updated>2009-11-03T23:36:38.562-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CollectionViewSource'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>CollectionViewSource in Silverlight</title><content type='html'>&lt;h5&gt;What is CollectionViewSource&lt;/h5&gt;&lt;p&gt;The &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource.aspx"&gt;CollectionViewSource&lt;/a&gt; is a class that is used in WPF to apply sorting and filtering on Data.  We can also use this class in Silverlight 3.&lt;br /&gt;I came across it while studying for my WPF exam and noticed it was also available in Silverlight. So naturally I had a look.  It is very easy to use as I will demonstrate below.&lt;/p&gt;&lt;h5&gt;So lets have a look.&lt;/h5&gt;&lt;p&gt;In this case, we have List of &lt;strong&gt;Person&lt;/strong&gt; we want be able to Filter and Sort correctly.&lt;br /&gt;&lt;br /&gt;A person could be defined like this : &lt;/p&gt;&lt;blockquote&gt;&lt;p class="MsoNormal" style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;public&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Person&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;{&lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;String&lt;/span&gt; FirstName { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;String&lt;/span&gt; LastName { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 'Courier New'; mso-ansi-language: nl-be; mso-no-proof: yes; mso-fareast-language: en-us; mso-bidi-language: ar-sa; mso-fareast-: minor-latinfont-family:calibri;font-size:10;"  &gt;}&lt;/span&gt; &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;To be able to use a CollectionViewSource we can define it as a resource in our XAML, we could also define it in code, but for this example we will write most in XAML. &lt;/p&gt;&lt;p&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;UserControl.Resources&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="LINE-HEIGHT: 115%; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;    &amp;lt;&lt;/span&gt;&lt;span style="LINE-HEIGHT: 115%; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;local&lt;/span&gt;&lt;span style="LINE-HEIGHT: 115%; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;:&lt;/span&gt;&lt;span style="LINE-HEIGHT: 115%; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;PersonDataSource&lt;/span&gt;&lt;span style="LINE-HEIGHT: 115%; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:red;"   &gt; key&lt;/span&gt;&lt;span style="LINE-HEIGHT: 115%; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;="data"&amp;gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt; &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;CollectionViewSource&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:red;"   &gt; Source&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;="{&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;Binding&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:red;"   &gt; Source&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;={&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;StaticResource&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:red;"   &gt; data&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;}}"&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:red;"   &gt; x&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;:&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:red;"   &gt;Key&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;="CollVS"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;&lt;span style="mso-spacerun: yes"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;CollectionViewSource.SortDescriptions&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;&lt;span style="mso-spacerun: yes"&gt;           &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;ComponentModel&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;:&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;SortDescription&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:red;"   &gt; Direction&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;="Descending"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;&lt;span style="mso-spacerun: yes"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;&amp;lt;/&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;CollectionViewSource.SortDescriptions&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;&amp;lt;/&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;CollectionViewSource&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="LINE-HEIGHT: 115%; mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;&amp;lt;/&lt;/span&gt;&lt;span lang="EN-US" style="LINE-HEIGHT: 115%; mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;UserControl.Resources&lt;/span&gt;&lt;span lang="EN-US" style="LINE-HEIGHT: 115%; mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="LINE-HEIGHT: 115%; mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;&lt;/span&gt;You see here that we defined a "data" datasource, we should create a class that will be able to store the information we need, lets call it &lt;strong&gt;PersonDataSource.  &lt;/strong&gt;We could also add some logic here to return some dummy data for now.  For this example I chose to simply inherit from &lt;em&gt;ObservableCollection&lt;/em&gt; and not add any additional logic, obviously you could use any collection here you would normally use to bind to a datagrid.&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;To finish our XAML UI, we add a DataGrid to display our data and a TextBox we can use for filtering. In our case we will apply filtering on the LastName.&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;StackPanel&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:red;"   &gt; Orientation&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;="Vertical"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;data&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;:&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;DataGrid&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:red;"   &gt; ItemsSource&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;="{&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;Binding&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:red;"   &gt; Source&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;={&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;StaticResource&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:red;"   &gt; CollVS&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;}}"/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;TextBox&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:red;"   &gt; x&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;:&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:red;"   &gt;Name&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;="filter"/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="LINE-HEIGHT: 115%; mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;&amp;lt;/&lt;/span&gt;&lt;span lang="EN-US" style="LINE-HEIGHT: 115%; mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:#a31515;"   &gt;StackPanel&lt;/span&gt;&lt;span lang="EN-US" style="LINE-HEIGHT: 115%; mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Now we can define how we are going to do our filtering and make sure the filtering is visible in the User interface.&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;public&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt; MainPage()&lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;{&lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;InitializeComponent();&lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;&lt;span style="color:green;"&gt;//Get the CollectionViewSource from the Resource of the UserControl &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;CollectionViewSource CollVS = (CollectionViewSource)Resources[&lt;span style="color:#a31515;"&gt;"CollVS"&lt;/span&gt;]; &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="color:green;"&gt;//Make sure we update the datagrid when we change our filter  &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;filter.TextChanged += &lt;span style="color:blue;"&gt;delegate&lt;/span&gt; { CollVS.View.Refresh(); };&lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;&lt;span style="color:green;"&gt;//Subscribe to the filter event  &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;CollVS.Filter += cvs_Filter;&lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;}&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt; &lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;/p&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;void&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt; cvs_Filter(&lt;span style="color:blue;"&gt;object&lt;/span&gt; sender, FilterEventArgs e)&lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;{&lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="font-size:78%;"&gt;   e.Accepted = ((Person)e.Item).LastName.ToLower().StartsWith(filter.Text.ToLower());&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="LINE-HEIGHT: 115%; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;}&lt;/span&gt; &lt;p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;So what did we do here ? First we needed to get our CollectionViewSource from our Resources. The most important thing here is that we do the following :&lt;br /&gt;&lt;br /&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;filter.TextChanged += &lt;span style="color:blue;"&gt;delegate&lt;/span&gt; { CollVS.View.Refresh(); }; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If we don't do this, our view will not update and we will not be able to see our filter&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;To filter, we can change if an Item should be filtered by setting the &lt;strong&gt;&lt;em&gt;Accepted&lt;/em&gt;&lt;/strong&gt; property , the Filter will be called for every element in your collection.&lt;br /&gt;&lt;br /&gt;The last step is to implement &lt;strong&gt;IComparable&lt;/strong&gt; on our Person object , this is required by the CollectionViewSource to apply sorting on the Collection.  &lt;span style="LINE-HEIGHT: 115%; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="font-family:Trebuchet MS;"&gt;The data will now be automatically sorted as it is filtered.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3165870666914080508-5330397050950806567?l=maartendewilde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maartendewilde.blogspot.com/feeds/5330397050950806567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maartendewilde.blogspot.com/2009/11/collectionviewsource-in-silverlight.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/5330397050950806567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/5330397050950806567'/><link rel='alternate' type='text/html' href='http://maartendewilde.blogspot.com/2009/11/collectionviewsource-in-silverlight.html' title='CollectionViewSource in Silverlight'/><author><name>Maarten De Wilde</name><uri>http://www.blogger.com/profile/11263486577385249299</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_aTL6Htl2AhY/S7tcL0sjxCI/AAAAAAAAAAs/_QXOcUynJaE/S220/Thumb1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3165870666914080508.post-509641486136601998</id><published>2009-10-30T15:37:00.001-07:00</published><updated>2009-11-03T06:40:52.908-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSL'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Downloading Dynamic files in Internet Explorer with SSL</title><content type='html'>&lt;p&gt;I recently had a problem while trying to download a file that was being generated dynamically from an ASP.NET application.&lt;/p&gt;  &lt;p&gt;This was being done the following way:&lt;/p&gt;  &lt;p&gt;&lt;span style="color: rgb(60, 106, 111);font-family:Courier New;" &gt;Response.Clear();    &lt;br /&gt;Response.AddHeader(&lt;span style="color: rgb(128, 0, 0);"&gt;"content-disposition"&lt;/span&gt;, &lt;span style="color: rgb(128, 0, 0);"&gt;"attachment; filename=EXAMPLE.bin"&lt;/span&gt;);     &lt;br /&gt;Response.AddHeader(&lt;span style="color: rgb(128, 0, 0);"&gt;"Content-Transfer-Encoding"&lt;span style="color: rgb(64, 0, 0);"&gt;,&lt;/span&gt; "binary"&lt;/span&gt;);     &lt;br /&gt;Response.AddHeader(&lt;span style="color: rgb(128, 0, 0);"&gt;"Content-Length"&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;/* The length */&lt;/span&gt;);     &lt;br /&gt;Response.ContentType = "&lt;span style="color: rgb(0, 128, 0);"&gt;/*Wanted content type*/&lt;/span&gt;";     &lt;br /&gt;Response.OutputStream.Write(&lt;span style="color: rgb(0, 128, 0);"&gt;/* Your File */&lt;/span&gt;);     &lt;br /&gt;Response.Flush();     &lt;br /&gt;Response.End();&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;When you run this code this will work perfectly for Firefox and IE, allowing you to download the generated file.&lt;/p&gt;  &lt;p&gt;However, once you enable SSL encryption on this website, you will get to following error message in Internet Explorer :&lt;/p&gt;  &lt;p&gt;&lt;span style="color: rgb(128, 0, 0);font-family:Verdana;font-size:78%;"  &gt;&lt;strong&gt;Internet Explorer cannot download &amp;lt;PAGENAME&amp;gt; from &amp;lt;SERVERNAME&amp;gt; .      &lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);font-family:Verdana;font-size:78%;"  &gt;&lt;strong&gt;Internet Explore was not able to open this Internet Site. The requested site is either unavailable or cannot be found. Please try again later.&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;You can fix this problem by adding the following line above your header definitions.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="color: rgb(60, 106, 111);"&gt;Response.ClearContent();      &lt;br /&gt;Response.ClearHeaders();&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;This way the request headers will be set correctly and you will be able to download your file from your SSL encrypted website.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3165870666914080508-509641486136601998?l=maartendewilde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maartendewilde.blogspot.com/feeds/509641486136601998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maartendewilde.blogspot.com/2009/10/downloading-dynamic-files-in-internet.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/509641486136601998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/509641486136601998'/><link rel='alternate' type='text/html' href='http://maartendewilde.blogspot.com/2009/10/downloading-dynamic-files-in-internet.html' title='Downloading Dynamic files in Internet Explorer with SSL'/><author><name>Maarten De Wilde</name><uri>http://www.blogger.com/profile/11263486577385249299</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_aTL6Htl2AhY/S7tcL0sjxCI/AAAAAAAAAAs/_QXOcUynJaE/S220/Thumb1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3165870666914080508.post-5059516710616349358</id><published>2009-10-30T15:06:00.001-07:00</published><updated>2009-10-30T16:17:42.823-07:00</updated><title type='text'>Opening of My Blog</title><content type='html'>&lt;p&gt;Hi everyone,&lt;/p&gt;  &lt;p&gt;My name is Maarten De Wilde, I am 21 years old. And I am currently working for &lt;a href="http://www.realdolmen.com/"&gt;RealDolmen&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I have been working with Silverlight 2 &amp;amp; 3 for the last year in combination with some ASP.NET development.&lt;/p&gt;  &lt;p&gt;This blog, will present issues I have encountered during my development within these platforms as well as information regarding development in general.&lt;/p&gt;    &lt;p&gt; &lt;/p&gt;  &lt;p&gt;I hope you will find my blog interesting to read.&lt;a href="http://technorati.com/tags/Silverlight" rel="tag"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3165870666914080508-5059516710616349358?l=maartendewilde.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maartendewilde.blogspot.com/feeds/5059516710616349358/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maartendewilde.blogspot.com/2009/10/opening-of-my-blog.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/5059516710616349358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3165870666914080508/posts/default/5059516710616349358'/><link rel='alternate' type='text/html' href='http://maartendewilde.blogspot.com/2009/10/opening-of-my-blog.html' title='Opening of My Blog'/><author><name>Maarten De Wilde</name><uri>http://www.blogger.com/profile/11263486577385249299</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_aTL6Htl2AhY/S7tcL0sjxCI/AAAAAAAAAAs/_QXOcUynJaE/S220/Thumb1.png'/></author><thr:total>1</thr:total></entry></feed>
