<?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-7109267400150843396</id><updated>2011-12-11T03:54:04.299-08:00</updated><category term='c#'/><category term='ObservableCollection'/><category term='viewmodel'/><category term='Chart'/><category term='detail'/><category term='wpf'/><category term='master'/><category term='fluidkit'/><title type='text'>Robert's Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://reyntjes.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7109267400150843396/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://reyntjes.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Robert</name><uri>http://www.blogger.com/profile/05660555650840919887</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7109267400150843396.post-5940670492249993556</id><published>2009-12-04T02:06:00.000-08:00</published><updated>2010-06-02T12:16:55.002-07:00</updated><title type='text'>A Generic Dialog ViewModel</title><content type='html'>&lt;h3&gt;



Introduction&lt;/h3&gt;
A few months ago I worked on a wpf viewmodel for dialogs, because it seemed strange to me that you needed for instance windows forms dialogs to open or save files in wpf. So I set about creating my own wpf dialogs. After creating the dialog viewmodels there still remained a small issue with the library and also I didn't have much time to write an article about it. I however published the library containing the viewmodels for dialogs with another article on my blog. Someone saw the viewmodel in this library and asked if I could write about it. I had a good look at the code again and solved the small problem and so here's the article.   
I remembered looking for a nice viewmodel for dialogs a few months ago but couldn't find any. In the mean time since I wrote the viewmodel &lt;a href="http://sachabarber.net/"&gt;Sacha Barber&lt;/a&gt; published his Cinch framework. &lt;a href="http://www.codeproject.com/KB/WPF/CinchIII.aspx"&gt;Part 3&lt;/a&gt; of his series on the &lt;a href="http://www.codeproject.com/"&gt;codeproject&lt;/a&gt; site describes a dialog service. My solution looks quite different so I hope you find this article still interesting. &lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;  

&lt;span class="fullpost"&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;&lt;h3&gt;



The DialogViewModel Definition &lt;/h3&gt;
The dialog viewmodel is a generic viewmodel. The DialogViewModel expects another viewmodel as a parameter. This parameter is the viewmodel for the content of the dialog window. Below you see the interface of the DialogViewModel and a short description of every property:   


&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;As can be seen in the definition of the DialogViewModel class the DialogContent property of the interface must be another viewmodel that uses the ICloneable&amp;lt;V&amp;gt; interface. This property binds to a ContentPresenter class in the dialog window. &lt;/li&gt;
&lt;li&gt;The DialogResult property indicates if an Ok button or Cancel button is pressed. Initially it is null. When it becomes true or false the dialog closes. &lt;/li&gt;
&lt;li&gt;When you assign an action to the FillDialogContent property, the action is called before the dialog is shown. You can do some stuff before like filling the dialog with content before the dialog appears. When you assign an action to the ProcessNewContent property this action gets called after the Ok button of the dialog is pressed.&amp;nbsp; An example of it's use can be found in my sample project that you can download. In it I created a progressbar dialog that raises it's value every second. In the FillDialogContent action the timer is started. &lt;/li&gt;
&lt;/ul&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;interface&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;IDialogViewModel&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;V&amp;gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region&lt;/span&gt;&lt;span style="color: black;"&gt; Data Members (4)&amp;nbsp; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&amp;nbsp; 
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; V DialogContent { &lt;/span&gt;&lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;span style="color: black;"&gt;; &lt;/span&gt;&lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;span style="color: black;"&gt;; } &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&amp;nbsp; 
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&lt;span style="color: black;"&gt;? DialogResult { &lt;/span&gt;&lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;span style="color: black;"&gt;; &lt;/span&gt;&lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;span style="color: black;"&gt;; } &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&amp;nbsp; 
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;Action&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;V&amp;gt; FillDialogContent { &lt;/span&gt;&lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;span style="color: black;"&gt;; &lt;/span&gt;&lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;span style="color: black;"&gt;; } &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&amp;nbsp; 
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;Action&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;V&amp;gt; ProcessNewContent{ &lt;/span&gt;&lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;span style="color: black;"&gt;; &lt;/span&gt;&lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;span style="color: black;"&gt;; } &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&amp;nbsp; 
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;/span&gt;&lt;span style="color: black;"&gt; Data Members&amp;nbsp; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&amp;nbsp; 
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;summary&amp;gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;///&lt;span style="color: green;"&gt; The ViewModel for the application's main window.&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;/summary&amp;gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;DialogViewModel&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;V&amp;gt; : &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;WorkspaceViewModel&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;IDialogViewModel&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;V&amp;gt;, &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;IEditableObject&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;where&lt;/span&gt;&lt;span style="color: black;"&gt; V : &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;ViewModelBase&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;ICloneable&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;V&amp;gt;, &lt;/span&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt;() &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&amp;nbsp; 
&lt;/div&gt;
Why did I define my viewmodel like this? Suppose for instance you have a Silverlight and a wpf project with some kind of form you want to fill in. In the wpf project you want to fill in the form through a dialog form. In the Silverlight project you maybe want to have the form on some kind of tab page. For both projects you can write one form viewmodel. All that is needed for creating a form viewmodel with extra dialog functionality is defining a dialog viewmodel with the form viewmodel as a parameter like this: &lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: #2b91af;"&gt;DialogViewModel&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;MyFormViewModel&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;. &lt;/span&gt;&lt;/span&gt;  


&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;



Inner workings of the DialogViewModel&lt;/h3&gt;
The DialogViewModel is derived from the WorkspaceViewModel. This viewmodel already has Show and Close commands. I added an extra Help Command for dialogs that have a Help button and an Ok Command for when the Ok button is pressed. Below you see the constructor of the viewmodel. The RequestShow and RequestClose events are defined in the WorkspaceViewModel and are called when the Show and Close commands of this viewmodel are called.   


&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; DialogViewModel(V content) &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DialogContent = content; &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _dialogService = &lt;/span&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;DialogService&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;V&amp;gt;(); &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;.RequestShow += &lt;/span&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;EventHandler&lt;/span&gt;&lt;span style="color: black;"&gt;(DialogViewModel_RequestShow); &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;.RequestClose += &lt;/span&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;EventHandler&lt;/span&gt;&lt;span style="color: black;"&gt;(DialogViewModel_RequestClose); &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BeginEdit(); &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&amp;nbsp; 
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&lt;span style="color: black;"&gt; DialogViewModel_RequestShow(&lt;/span&gt;&lt;span style="color: blue;"&gt;object&lt;/span&gt;&lt;span style="color: black;"&gt; sender, &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt;&lt;span style="color: black;"&gt; e) &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Wpf.MVVM.Views.&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;DialogBehavior&lt;/span&gt;&lt;span style="color: black;"&gt;.ShowDialog(&lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;); &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&amp;nbsp; 
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&lt;span style="color: black;"&gt; DialogViewModel_RequestClose(&lt;/span&gt;&lt;span style="color: blue;"&gt;object&lt;/span&gt;&lt;span style="color: black;"&gt; sender, &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt;&lt;span style="color: black;"&gt; e) &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CancelEdit(); &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&amp;nbsp; 
&lt;/div&gt;
The ShowDialog method resides in a static class called DialogBehavior and is needed to keep the viewmodel separated from the view. The method looks like this and is self explanatory I think:   


&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas;"&gt;&lt;span style="font-size: 9pt;"&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;summary&amp;gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;///&lt;span style="color: green;"&gt; Shows the dialog. &lt;/span&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;///&lt;span style="color: green;"&gt; First it creates a dialog window. Then it connects the viewmodel&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;///&lt;span style="color: green;"&gt; to the DataContext of the dialog. The FillDialogContent action is called&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;///&lt;span style="color: green;"&gt; so the program can perform some actions before the dialog is shown.&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;///&lt;span style="color: green;"&gt; The ProcessNewContent action is called so the program can perform some &lt;/span&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;///&lt;span style="color: green;"&gt; actions after the dialog is shown and the Ok button is pressed.&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;/summary&amp;gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;param name="viewModel"&amp;gt;&lt;span style="color: green;"&gt;The viewmodel contained in the dialog viewmodel.&lt;/span&gt;&amp;lt;/param&amp;gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;static&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&lt;span style="color: black;"&gt; ShowDialog&amp;lt;T&amp;gt;(&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;IDialogViewModel&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;T&amp;gt; viewModel) &lt;/span&gt;&lt;span style="color: blue;"&gt;where&lt;/span&gt;&lt;span style="color: black;"&gt; T : &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;ViewModelBase&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;ICloneable&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;T&amp;gt;, &lt;/span&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt;() &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&lt;span style="color: black;"&gt; dialogResult = &lt;/span&gt;&lt;span style="color: blue;"&gt;false&lt;/span&gt;&lt;span style="color: black;"&gt;; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;DialogWindow&lt;/span&gt;&lt;span style="color: black;"&gt; window = &lt;/span&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;DialogWindow&lt;/span&gt;&lt;span style="color: black;"&gt;(); &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; window.DataContext = viewModel; &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;span style="color: black;"&gt; (viewModel.FillDialogContent != &lt;/span&gt;&lt;span style="color: blue;"&gt;null&lt;/span&gt;&lt;span style="color: black;"&gt;) &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; viewModel.FillDialogContent(viewModel.DialogContent); &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&lt;span style="color: black;"&gt;? result = window.ShowDialog(); &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;span style="color: black;"&gt; (result.HasValue &amp;amp;&amp;amp; result.Value) &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;span style="color: black;"&gt; (viewModel.ProcessNewContent != &lt;/span&gt;&lt;span style="color: blue;"&gt;null&lt;/span&gt;&lt;span style="color: black;"&gt;) &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; viewModel.ProcessNewContent(viewModel.DialogContent); &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dialogResult = &lt;/span&gt;&lt;span style="color: blue;"&gt;true&lt;/span&gt;&lt;span style="color: black;"&gt;; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; window = &lt;/span&gt;&lt;span style="color: blue;"&gt;null&lt;/span&gt;&lt;span style="color: black;"&gt;; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&lt;span style="color: black;"&gt; dialogResult; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;    
&lt;/div&gt;
When you look again at the definition of the dialog viewmodel you see that it has an IEditableObject interface. This interface provides functionality to commit or rollback changes to an object that is used as a data source. Below you see the implemented methods. The BeginEdit method is called when the show command is executed. The content of the dialog is saved in the _oldContent variable. And a copy of the original content is created. This copy will be edited in the dialog.   
This is why the DialogContent property needs a viewmodel that implements the &lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: #2b91af;"&gt;ICloneable&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;V&amp;gt; &lt;/span&gt;&lt;/span&gt;interface. This interface has the Clone and MakeCopyTo methods. The dialog viewmodel uses these two methods to make a temporary copy of the original dialog content.   
When the Cancel button is pressed the CancelEdit method is called and the original content becomes the DialogContent again. When the Ok button is pressed the EndEdit method is called and the content that is changed in the dialog becomes the DialogContent.   


&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&lt;span style="color: black;"&gt; BeginEdit() &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;span style="color: black;"&gt; (!Editing) &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _oldContent = _dialogContent; &lt;/span&gt;&lt;span style="color: green;"&gt;// The content to be saved.&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DialogContent = _dialogContent.Clone(); &lt;/span&gt;&lt;span style="color: green;"&gt;// The content to be edited.&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Editing = &lt;/span&gt;&lt;span style="color: blue;"&gt;true&lt;/span&gt;&lt;span style="color: black;"&gt;; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&amp;nbsp; 
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&lt;span style="color: black;"&gt; CancelEdit() &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;Debug&lt;/span&gt;&lt;span style="color: black;"&gt;.Assert(&lt;/span&gt;&lt;span style="color: blue;"&gt;true&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #a31515;"&gt;"CancelEdit"&lt;/span&gt;&lt;span style="color: black;"&gt;); &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green;"&gt;// The Dialogcontent should become the old class.&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&lt;span style="color: black;"&gt; (Editing) &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DialogContent = _oldContent; &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Editing = &lt;/span&gt;&lt;span style="color: blue;"&gt;false&lt;/span&gt;&lt;span style="color: black;"&gt;; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DialogResult = &lt;/span&gt;&lt;span style="color: blue;"&gt;false&lt;/span&gt;&lt;span style="color: black;"&gt;; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&amp;nbsp; 
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&lt;span style="color: black;"&gt; EndEdit() &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green;"&gt;// The edited content is copied to the old content and that becomes the new DialogContent.&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DialogContent = DialogContent.MakeCopyTo(_oldContent); &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Editing = &lt;/span&gt;&lt;span style="color: blue;"&gt;false&lt;/span&gt;&lt;span style="color: black;"&gt;; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DialogResult = &lt;/span&gt;&lt;span style="color: blue;"&gt;true&lt;/span&gt;&lt;span style="color: black;"&gt;; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&amp;nbsp; 
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;    
&lt;/div&gt;
&lt;h3&gt;



The View &lt;/h3&gt;
The dialog window has three buttons and a ContentPresenter control. The xaml code you see below:   


&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Window&lt;/span&gt;&lt;span style="color: red;"&gt; x&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;Class&lt;/span&gt;&lt;span style="color: blue;"&gt;="Wpf.MVVM.Views.DialogWindow"&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;lt;!—the libraries used. Removed here for clarity --&amp;gt;&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;Title&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;=DisplayName}"&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;vw&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;DialogBehavior.CloseWithResultWhenDone&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;=DialogResult}"&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;WindowStyle&lt;/span&gt;&lt;span style="color: blue;"&gt;="ToolWindow"&lt;/span&gt;&lt;span style="color: red;"&gt; WindowStartupLocation&lt;/span&gt;&lt;span style="color: blue;"&gt;="CenterOwner"&lt;/span&gt;&lt;span style="color: red;"&gt; SizeToContent&lt;/span&gt;&lt;span style="color: blue;"&gt;="WidthAndHeight"&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;Closing&lt;/span&gt;&lt;span style="color: blue;"&gt;="Window_Closing"&amp;gt;&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green;"&gt;&amp;lt;!—some styles removed here for clarity--&amp;gt;&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;ContentPresenter&lt;/span&gt;&lt;span style="color: red;"&gt; Content&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;=DialogContent}"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;ContentPresenter&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color: red;"&gt; Orientation&lt;/span&gt;&lt;span style="color: blue;"&gt;="Horizontal"&lt;/span&gt;&lt;span style="color: red;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="color: blue;"&gt;="Right"&lt;/span&gt;&lt;span style="color: red;"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="color: blue;"&gt;="Bottom"&amp;gt;&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Button&lt;/span&gt;&lt;span style="color: red;"&gt; x&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;Name&lt;/span&gt;&lt;span style="color: blue;"&gt;="HelpButton"&lt;/span&gt;&lt;span style="color: red;"&gt; Width&lt;/span&gt;&lt;span style="color: blue;"&gt;="72"&lt;/span&gt;&lt;span style="color: red;"&gt; Command&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;=HelpCommand}"&lt;/span&gt;&lt;span style="color: red;"&gt; Visibility&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;=HelpVisible}"&amp;gt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Help&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Button&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Button&lt;/span&gt;&lt;span style="color: red;"&gt; x&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;Name&lt;/span&gt;&lt;span style="color: blue;"&gt;="OkButton"&lt;/span&gt;&lt;span style="color: red;"&gt; IsDefault&lt;/span&gt;&lt;span style="color: blue;"&gt;="True"&lt;/span&gt;&lt;span style="color: red;"&gt; Width&lt;/span&gt;&lt;span style="color: blue;"&gt;="72"&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;Command&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;=OkCommand}"&lt;/span&gt;&lt;span style="color: red;"&gt; Visibility&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;=OkVisible}"&amp;gt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Ok&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Button&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Button&lt;/span&gt;&lt;span style="color: red;"&gt; x&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;Name&lt;/span&gt;&lt;span style="color: blue;"&gt;="CancelButton"&lt;/span&gt;&lt;span style="color: red;"&gt; Width&lt;/span&gt;&lt;span style="color: blue;"&gt;="72"&lt;/span&gt;&lt;span style="color: red;"&gt; IsCancel&lt;/span&gt;&lt;span style="color: blue;"&gt;="True"&lt;/span&gt;&lt;span style="color: red;"&gt; Command&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;=CloseCommand}"&lt;/span&gt;&lt;span style="color: red;"&gt; Visibility&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;=CancelVisible}"&amp;gt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Cancel&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Button&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Window&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;/div&gt;
The DialogResult property of the Window class is not a dependency property. In the static DialogBehavior class there's a dependency property called CloseWithResultWhenDone. When the DialogResult property of the viewmodel changes the dependency property changes and the method OnCloseWithResultWhenDone is called. In this method the DialogResult of the window class is set. When the DialogResult of the window is set the dialog closes.   
The ContentPresenter binds to the DialogContent of the dialog viewmodel. The way the dialog looks depends on the type of viewmodel of the generic DialogContent property. Every viewmodel needs a datatemplate to connect the viewmodel with a view.   


&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;



Some Examples&lt;/h3&gt;
The simplest example I can give you of a real world example is that of a message dialog. The viewmodel of this dialog is defined below:   


&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;MessageViewModel&lt;/span&gt;&lt;span style="color: black;"&gt; : &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;ViewModelBase&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;ICloneable&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;MessageViewModel&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&lt;span style="color: black;"&gt; _message; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&lt;span style="color: black;"&gt; Message &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;span style="color: black;"&gt; { &lt;/span&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&lt;span style="color: black;"&gt; _message; } &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _message = &lt;/span&gt;&lt;span style="color: blue;"&gt;value&lt;/span&gt;&lt;span style="color: black;"&gt;; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RaisePropertyChanged(() =&amp;gt; Message); &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region&lt;/span&gt;&lt;span style="color: black;"&gt; ICloneable&amp;lt;MessageViewModel&amp;gt; Members &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&amp;nbsp; 
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;MessageViewModel&lt;/span&gt;&lt;span style="color: black;"&gt; Clone() &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&lt;span style="color: black;"&gt; MakeCopyTo(&lt;/span&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;MessageViewModel&lt;/span&gt;&lt;span style="color: black;"&gt;()); &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&amp;nbsp; 
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;MessageViewModel&lt;/span&gt;&lt;span style="color: black;"&gt; MakeCopyTo(&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;MessageViewModel&lt;/span&gt;&lt;span style="color: black;"&gt; copyTo) &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; copyTo.DisplayName = &lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;.DisplayName; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; copyTo.Message = &lt;/span&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;&lt;span style="color: black;"&gt;.Message; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&lt;span style="color: black;"&gt; copyTo; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&amp;nbsp; 
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;    
&lt;/div&gt;
There's a message property and the ICloneable interface is implemented. The Clone method of this interface creates a new viewmodel and fills it with the current property values of the message viewmodel. The MakeCopyTo method does this for an already existing viewmodel. See the BeginEdit, CancelEdit and EndEdit methods described in the "Inner workings of the DialogViewModel" chapter to see how the methods of the ICloneable interface are used. The DataTemplate of the message viewmodel contains only a label with the Content bound to the Message property of the viewmodel.   


&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color: red;"&gt; DataType&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;x&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Type&lt;/span&gt;&lt;span style="color: red;"&gt; vm&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;MessageViewModel&lt;/span&gt;&lt;span style="color: blue;"&gt;}"&amp;gt;&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Label&lt;/span&gt;&lt;span style="color: red;"&gt; Content&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;=Message}"&lt;/span&gt;&lt;span style="color: red;"&gt; Margin&lt;/span&gt;&lt;span style="color: blue;"&gt;="10"&lt;/span&gt;&lt;span style="color: red;"&gt; Padding&lt;/span&gt;&lt;span style="color: blue;"&gt;="2,2"/&amp;gt;&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&amp;nbsp; 
&lt;/div&gt;
&lt;span style="font-family: inherit;"&gt;You can create a message dialog viewmodel by calling these methods:&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;   
&lt;span style="font-family: consolas; font-size: 9pt;"&gt;&lt;span style="color: #2b91af;"&gt;DialogViewModel&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;MessageViewModel&lt;/span&gt;&amp;gt; messageViewModel = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DialogViewModel&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;MessageViewModel&lt;/span&gt;&amp;gt;(dvm.MessageViewModel); &lt;/span&gt;  
&lt;span style="font-family: consolas; font-size: 9pt;"&gt;messageViewModel.CancelVisible = &lt;span style="color: #2b91af;"&gt;Visibility&lt;/span&gt;.Hidden;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: consolas; font-size: 9pt;"&gt;&lt;/span&gt;  

You can also create a MessageDialogViewModel like this:   


&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;MessageDialogViewModel&lt;/span&gt;&lt;span style="color: black;"&gt; : &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;DialogViewModel&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;MessageViewModel&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; MessageDialogViewModel() &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : &lt;/span&gt;&lt;span style="color: blue;"&gt;base&lt;/span&gt;&lt;span style="color: black;"&gt;() &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CancelVisible = &lt;/span&gt;&lt;span style="color: #2b91af;"&gt;Visibility&lt;/span&gt;&lt;span style="color: black;"&gt;.Hidden; &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&amp;nbsp; 
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="font-family: consolas; font-size: 10pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&lt;span style="color: black;"&gt; MessageDialogViewModel(&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;MessageViewModel&lt;/span&gt;&lt;span style="color: black;"&gt; vm) : &lt;/span&gt;&lt;span style="color: blue;"&gt;base&lt;/span&gt;&lt;span style="color: black;"&gt;(vm) { } &lt;/span&gt;&lt;/span&gt;    
&lt;/div&gt;
&lt;div style="background: white;"&gt;
&lt;span style="color: black; font-family: consolas; font-size: 10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;    
&lt;/div&gt;
For the more complicated viewmodels this is the recommended method.   
I also created a dialog viewmodel and form for selecting folders and one for a dialog with a progress bar. Most of the code for selecting a folder I "borrowed" from the &lt;a href="http://mef.codeplex.com/"&gt;MEF&lt;/a&gt; examples. It's included in an example called XFileExplorer.   


&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;



Remarks &lt;/h3&gt;
&lt;/span&gt;&lt;span class="fullpost"&gt;If you have suggestions or any other comments please let me know. I would really like to hear from you.   
The source code for Windows Visual Studio 2010 (solution file DialogsMVVM4) and visual studio 2008 (solution file DialogsMVVM) you can download &lt;a href="http://sites.google.com/site/projectsincsharp/Home/my-files/Dialogs.zip?attredirects=0&amp;amp;d=1"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7109267400150843396-5940670492249993556?l=reyntjes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reyntjes.blogspot.com/feeds/5940670492249993556/comments/default' title='Reacties plaatsen'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7109267400150843396&amp;postID=5940670492249993556' title='0 reacties'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7109267400150843396/posts/default/5940670492249993556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7109267400150843396/posts/default/5940670492249993556'/><link rel='alternate' type='text/html' href='http://reyntjes.blogspot.com/2009/12/generic-dialog-viewmodel.html' title='A Generic Dialog ViewModel'/><author><name>Robert</name><uri>http://www.blogger.com/profile/05660555650840919887</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7109267400150843396.post-6255921814398931774</id><published>2009-09-15T07:37:00.000-07:00</published><updated>2010-06-02T12:17:58.761-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wpf'/><category scheme='http://www.blogger.com/atom/ns#' term='Chart'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Freeing the axes of the Microsoft toolkit charting control</title><content type='html'>&lt;h3&gt;
Introduction&lt;/h3&gt;
Most charting tools produce the same kind of charts. A chart has a vertical axis on the left (or right) and a horizontal axis on the bottom (or top). You can add more axes but they are stuck to the sides of the chart and keep occupying the whole length of the chart area. In medical applications we want to have charts like the one below. For the interested: The first five signals are EEG signals, (the electrical activity in the brain). Below the EEG signals are the patients breathing signal, the blood pressure and the heartbeat (ECG) signal.&lt;br /&gt;
&lt;a href="http://lh3.ggpht.com/_GFw1SxNbrEs/Sq-lsbLu7GI/AAAAAAAAEaA/kJQ6uClAYR0/s1600-h/Eeg4.jpg"&gt;&lt;img alt="Eeg" border="0" height="318" src="http://lh5.ggpht.com/_GFw1SxNbrEs/Sq-ls1oaunI/AAAAAAAAEaE/1UvYpcXIuFk/Eeg_thumb2.jpg?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="Eeg" width="398" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;The signals are stacked on top of each other. If one signal gets big it can reach the space of the signal below or above it. So there’s one plot area for all signals. As I said before all free WPF chart tools I know don’t have the option of creating a chart like the picture above. In my job as a programmer in a hospital I often need charts like these to display medical data. In this blog post I want to talk about my first attempt to create a chart like the one above.&lt;br /&gt;
&lt;span class="fullpost"&gt;   &lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;&lt;h3&gt;
Microsoft’s Charting Control&lt;/h3&gt;
In June 2009 Microsoft released a charting control as part of their &lt;a href="http://wpf.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=29117"&gt;WPF toolkit&lt;/a&gt;. Because they released the source code of the toolkit it is easy to extend the functionality of the original toolkit. The main class of the charting control is the &lt;a href="http://wpf.codeplex.com/SourceControl/changeset/view/28036#564310"&gt;Chart&lt;/a&gt; class. This class has a property called ChartArea of type &lt;a href="http://wpf.codeplex.com/SourceControl/changeset/view/28036#564322"&gt;EdgePanel&lt;/a&gt; that is derived from the Panel class. The EdgePanel class overrides the ArrangeOverride and MeasureOverride methods of the Panel class to arrange the axes. In my first attempt to create a chart like the EEG chart above I created a new class called StackedPanel and tried to arrange the axes on the left on top of each other. The EdgePanel class was then replaced with the StackedPanel class. I asked a question about it &lt;a href="http://forums.silverlight.net/forums/p/98856/228953.aspx#228953"&gt;here&lt;/a&gt;.&lt;br /&gt;
Later I noticed that all classes derived from Axis in the toolkit can be used without the need for any other classes of the toolkit. So you can for instance take the LinearAxis class set it’s location, orientation, minimum and maximum values, put it on a canvas and it displays a nice looking axis. That made me decide to write my own simple chart class. To keep things simple I just wanted to use the classes derived from the base Axis class of Microsoft’s Charting Control. I considered using the LineSeries class to show the data,&amp;nbsp; but that would make my Chart class more complicated. I decided to create my own FastLineSeries class because I need a class that can show large amounts of data anyway and the LineSeries in Microsoft’s class uses a PolyLine class to draw it’s data. There are faster methods to draw lines in WPF then with a PolyLine.&lt;br /&gt;
The source code that comes with this article contains a solution with three small programs and a library. The contents of the solution are:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Thumbs: A small demonstration program described in the paragraph below.&lt;/li&gt;
&lt;li&gt;FreeAxes: A program that allows you to drag and resize the all axes.&lt;/li&gt;
&lt;li&gt;StackedAxes: A program that stacks all vertical axes.&lt;/li&gt;
&lt;li&gt;Wpf.Axes: A library that the FreeAxes and StackedAxes programs use.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
Sukram’s WPF Diagram Designer&lt;/h3&gt;
I wanted to be able to drag the axes of my program around and resize them. The plot area should adapt to the location and the size of the axes. There is a very nice &lt;a href="http://www.codeproject.com/script/Articles/MemberArticles.aspx?amid=65924"&gt;series of articles&lt;/a&gt; on the CodeProject site by Sukram called WPF Diagram Designer. The &lt;a href="http://www.codeproject.com/KB/WPF/WPFDiagramDesigner_Part1.aspx"&gt;first article&lt;/a&gt; of this series describes how you can move and resize any control that you put in a ContentControl. The window below shows the first program I created for testing purposes. The black rectangles represent the axes and the gray border is the plot area. In the upper left corner is a checkbox. If you select the checkbox the rectangles can be resized. If you deselect the checkbox the rectangles only can be moved. If you move the axes around you see that the plot area changes according to the position and size of the axes.&lt;br /&gt;
&lt;a href="http://lh3.ggpht.com/_GFw1SxNbrEs/Sq-luQoiXZI/AAAAAAAAEaI/-5XRHbAlzqs/s1600-h/Thumbs%5B6%5D.jpg"&gt;&lt;img alt="Thumbs" border="0" height="330" src="http://lh3.ggpht.com/_GFw1SxNbrEs/Sq-luvwZQ4I/AAAAAAAAEaM/JXE8u8zF-ug/Thumbs_thumb%5B4%5D.jpg?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="Thumbs" width="386" /&gt;&lt;/a&gt;&lt;br /&gt;
The FakeAxis class in this test program is derived from the Control class and implements the IAxis interface of the Microsoft Chart Control. The most important part of the code is shown below:&lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FakeAxis&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Control&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;IAxis&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;static&lt;/span&gt; FakeAxis()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DefaultStyleKeyProperty.OverrideMetadata(&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;FakeAxis&lt;/span&gt;), &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FrameworkPropertyMetadata&lt;/span&gt;(&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;FakeAxis&lt;/span&gt;)));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Instantiates a new instance of the Axis class.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; FakeAxis()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RegisteredListeners = &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: #2b91af;"&gt;IAxisListener&lt;/span&gt;&amp;gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.RegisteredListeners.CollectionChanged += &lt;span style="color: blue;"&gt;new&lt;/span&gt; System.Collections.Specialized.&lt;span style="color: #2b91af;"&gt;NotifyCollectionChangedEventHandler&lt;/span&gt;(RegisteredListeners_CollectionChanged);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LayoutUpdated += &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;EventHandler&lt;/span&gt;(Axis_LayoutUpdated);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Axis_LayoutUpdated(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Invalidate();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;internal&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Invalidate()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OnInvalidated(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;RoutedEventArgs&lt;/span&gt;());&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Raises the invalidated event.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;param name="args"&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;Information about the event.&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; OnInvalidated(&lt;span style="color: #2b91af;"&gt;RoutedEventArgs&lt;/span&gt; args)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;IAxisListener&lt;/span&gt; listener &lt;span style="color: blue;"&gt;in&lt;/span&gt; RegisteredListeners)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; listener.AxisInvalidated(&lt;span style="color: blue;"&gt;this&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
The IAxis interface has a property called RegisteredListeners. The plot area implements the IAxisListener interface and its AxisInvalidated method is called when an Axis changes its position or size. When the chart canvas is initialized all components that implement the IAxisListener interface are added to the RegisteredListeners collection of the axes:&lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ChartCanvas_Initialized(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;ChartArea&lt;/span&gt; area = Children.OfType&amp;lt;&lt;span style="color: #2b91af;"&gt;ChartArea&lt;/span&gt;&amp;gt;().First();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;ContentControl&lt;/span&gt;&amp;gt; ctrls = Children.OfType&amp;lt;&lt;span style="color: #2b91af;"&gt;ContentControl&lt;/span&gt;&amp;gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;FakeAxis&lt;/span&gt;&amp;gt; axes = ctrls.Select(c =&amp;gt; c.Content).OfType&amp;lt;&lt;span style="color: #2b91af;"&gt;FakeAxis&lt;/span&gt;&amp;gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;FakeAxis&lt;/span&gt; axis &lt;span style="color: blue;"&gt;in&lt;/span&gt; axes)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; area.Axes.Add(axis);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; axis.RegisteredListeners.Add(area);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; axis.InvalidateVisual();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;
The class library for the stacked axes and for freely movable axes&lt;/h3&gt;
Below is a class diagram of library. The FreePanel class you can use to move axes freely around it’s canvas. The StackedPanel class will stack the available axes with vertical orientation on top of each other. The FastLineSeries is for drawing the line series.&lt;br /&gt;
&lt;a href="http://lh6.ggpht.com/_GFw1SxNbrEs/Ss7wdEPnLbI/AAAAAAAAEws/ngxKrNDkPYo/s1600-h/image12.png"&gt;&lt;img alt="image" border="0" height="394" src="http://lh4.ggpht.com/_GFw1SxNbrEs/Ss7wdRzkPtI/AAAAAAAAEww/43lnWpx5wMo/image_thumb8.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" width="546" /&gt;&lt;/a&gt; &lt;br /&gt;
I used an &lt;a href="http://msdn.microsoft.com/en-us/magazine/dd483292.aspx"&gt;msdn article&lt;/a&gt; by Charles Petzold as the starting point for my FastLineSeries class. I won’t describe the inner workings of&amp;nbsp; this class. If you want to read more about fast drawing in WPF you can read the article. I changed Petzold’s code so instead of displaying a scatter plot it displays a line plot now. This class I named GeometryPlotVisuals. The FastLineSeries derives form the GeometryPlotVisuals class and implements the IAxisListener interface. The AxisInvalidated method of the FastLineSeries looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; AxisInvalidated(&lt;span style="color: #2b91af;"&gt;IAxis&lt;/span&gt; axis)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;double&lt;/span&gt; scaleY = calculateScale(DependentAxis &lt;span style="color: blue;"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NumericAxis&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Scale.ScaleY = -scaleY;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Scale.ScaleX = calculateScale(IndependentAxis &lt;span style="color: blue;"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NumericAxis&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Translate.Y = DependentAxis.ActualHeight;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Translate.X = 0;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Clip = SeriesClip;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;double&lt;/span&gt; calculateScale(&lt;span style="color: #2b91af;"&gt;NumericAxis&lt;/span&gt; axis){&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;UnitValue&lt;/span&gt;? max = axis.GetPlotAreaCoordinate(axis.Maximum);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;UnitValue&lt;/span&gt;? min = axis.GetPlotAreaCoordinate(axis.Minimum);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; (max.Value.Value - min.Value.Value) / (axis.Maximum.Value - axis.Minimum.Value);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
The FastLineSeries uses the ScaleTransform and TranslateTransform classes to position the line series.&amp;nbsp; I’m not really sure about using the ScaleTransform to position the series because it also changes the thickness of the line. I’ll probably change this in the future.
    &lt;br /&gt;The last line of the AxisInvalidated method sets the clipping region of the chart area so that values outside of the chart area become invisible.&lt;br /&gt;
ChartPanel is the base class for the classes FreePanel and StackedPanel. Because Sukram’s Diagram Designer classes need a Canvas I had to use the Canvas class as it’s base class and not the Panel class. The class searches for axes and series that are placed on it’s canvas and adds them to the Axes and Series ObservableCollections.&lt;br /&gt;
&lt;h3&gt;
An example program with movable and resizable axes&lt;/h3&gt;
I was surprised how easy it was to display an axis of Microsoft’s chart control. I just had to replace the axis I created in my test program with the LinearAxis class of the chart control.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;chart&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: #a31515;"&gt;LinearAxis&lt;/span&gt;&lt;span style="color: red;"&gt; x&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;Key&lt;/span&gt;&lt;span style="color: blue;"&gt;="xAxis"&lt;/span&gt;&amp;nbsp; &lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt; Orientation&lt;/span&gt;&lt;span style="color: blue;"&gt;="X"&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt; Location&lt;/span&gt;&lt;span style="color: blue;"&gt;="Bottom"&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt; Minimum&lt;/span&gt;&lt;span style="color: blue;"&gt;="0"&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt; Maximum&lt;/span&gt;&lt;span style="color: blue;"&gt;="100"&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt; Interval&lt;/span&gt;&lt;span style="color: blue;"&gt;="10"&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt; IsHitTestVisible&lt;/span&gt;&lt;span style="color: blue;"&gt;="False"/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;span style="color: blue;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;&lt;/span&gt;&lt;/div&gt;
Below is my definition for the x axis of the program. The Style property of the ContentControl uses a static resource called DesignerItemStyle. This style is created by Sukram to give drag and drop and resize capabilities to a ContentControl. Just put the axis in a ContentControl and you can move it around and resize it:&lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;ContentControl&lt;/span&gt;&lt;span style="color: red;"&gt; Width&lt;/span&gt;&lt;span style="color: blue;"&gt;="402"&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt; Height&lt;/span&gt;&lt;span style="color: blue;"&gt;="50"&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt; Padding&lt;/span&gt;&lt;span style="color: blue;"&gt;="1"&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt; Canvas.Left&lt;/span&gt;&lt;span style="color: blue;"&gt;="55"&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt; Canvas.Top&lt;/span&gt;&lt;span style="color: blue;"&gt;="329"&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt; Style&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;StaticResource&lt;/span&gt;&lt;span style="color: red;"&gt; DesignerItemStyle&lt;/span&gt;&lt;span style="color: blue;"&gt;}"&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt; Content&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;StaticResource&lt;/span&gt;&lt;span style="color: red;"&gt; xAxis&lt;/span&gt;&lt;span style="color: blue;"&gt;}"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;ContentControl&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
Every time you move or resize an axis that is placed on a FreePanel canvas. The MeasureOverride and ArrangeOverride methods are called. In the FreePanel class we don’t need the MeasureOverride method and only use the ArrangeOverride method. The ArrangeOverride method calculates the new location&amp;nbsp; and calls the AxisInvalidated method for all the FastLineSeries the class holds.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; System.Windows.&lt;span style="color: #2b91af;"&gt;Size&lt;/span&gt; ArrangeOverride(System.Windows.&lt;span style="color: #2b91af;"&gt;Size&lt;/span&gt; finalSize)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;this&lt;/span&gt;._vertCtrls == &lt;span style="color: blue;"&gt;null&lt;/span&gt; || &lt;span style="color: blue;"&gt;this&lt;/span&gt;._horzCtrls == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; finalSize;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vertAxesPositions.Clear(); horzAxesPositions.Clear();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// fill the dictionary with left positions&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;ContentControl&lt;/span&gt; child &lt;span style="color: blue;"&gt;in&lt;/span&gt; _horzCtrls)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; horzAxesPositions.Add(&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;KeyValuePair&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;UIElement&lt;/span&gt;, &lt;span style="color: blue;"&gt;double&lt;/span&gt;&amp;gt;(child.Content &lt;span style="color: blue;"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;UIElement&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;.GetLeft(child)));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// fill the dictionary with top positions&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;ContentControl&lt;/span&gt; child &lt;span style="color: blue;"&gt;in&lt;/span&gt; _vertCtrls)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vertAxesPositions.Add(&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;KeyValuePair&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;UIElement&lt;/span&gt;, &lt;span style="color: blue;"&gt;double&lt;/span&gt;&amp;gt;(child.Content &lt;span style="color: blue;"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;UIElement&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;.GetTop(child)));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; positionSeries();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;base&lt;/span&gt;.ArrangeOverride(finalSize);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Positions the series.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; positionSeries()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// look for the minimum left position of the axes&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;double&lt;/span&gt; left = _horzCtrls.Select(p =&amp;gt; &lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;.GetLeft(p)).Min();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// look for the minimum top position of the axes&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;double&lt;/span&gt; top = _vertCtrls.Select(p =&amp;gt; &lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;.GetTop(p)).Min();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// look for the maximum bottom position of the axes&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;double&lt;/span&gt; bottom = _vertCtrls.Select(p =&amp;gt; &lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;.GetTop(p) + p.Height).Max();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// look for the maximum right position of the axes&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;double&lt;/span&gt; right = _horzCtrls.Select(p =&amp;gt; &lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;.GetLeft(p) + p.Width).Max();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (Series != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;FastLineSeries&lt;/span&gt; child &lt;span style="color: blue;"&gt;in&lt;/span&gt; Series)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (child.IndependentAxis == &lt;span style="color: blue;"&gt;null&lt;/span&gt; || child.DependentAxis == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;continue&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;double&lt;/span&gt; curX = horzAxesPositions[child.IndependentAxis];&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;double&lt;/span&gt; curY = vertAxesPositions[child.DependentAxis];&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;.SetLeft(child, curX);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;.SetTop(child, curY);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; child.SeriesClip = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;RectangleGeometry&lt;/span&gt;(&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Rect&lt;/span&gt;(&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; top - curY,&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; right - left,&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bottom - top)); ;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; child.AxisInvalidated(&lt;span style="color: blue;"&gt;null&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
A Stacked chart&lt;/h3&gt;
The stacked chart needed more complicated MeasureOverride and ArrangeOverride methods. First because it needs to look at the size of the panel and change the size of the axes accordingly. Also I added a Proportion attached property that made things more complicated. The Proportion property allows you to set the size of an axis based on a given percentage. For instance, if you have two vertical axes where one has a Proportion value of 0.25 and the other of 0.75 the first only occupies 25% of the total vertical space available. Alec Bryte has a nice blog article about it that you can find &lt;a href="http://www.alecbryte.com/post/2009/01/16/WPF-Proportional-Panel.aspx"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;h3&gt;
Remarks&lt;/h3&gt;
The program described was created just as a proof of principle for myself. I can now create axes and move them around. The attached series adapts to the size and position of the axes. I know that there is still a lot of room for improvement. There’s still a lot of work to do before I have something that can display medical data like the first picture in this article. &lt;br /&gt;
As I said in the introduction in my first attempt I tried to create a stacked chart with the LineSeries of the toolkit. That turned out to be very complicated, but I’m still looking at it. Here are some of the things I still have to do:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Integrate my chart class more closely with the WPF toolkit’s Chart Control. &lt;/li&gt;
&lt;li&gt;Be able to display all data series types of the toolkit in my chart. &lt;/li&gt;
&lt;li&gt;Derive my FastLineSeries from a Series abstract class of the toolkit. &lt;/li&gt;
&lt;/ul&gt;
I hope to get some feedback on how to improve the program and proceed further with this.&lt;br /&gt;
The source code for the program you can download &lt;a href="http://sites.google.com/site/projectsincsharp/Home/my-files/FreeAxis.zip?attredirects=0"&gt;here&lt;/a&gt;. The WPF toolkit isn’t included in the zip file. You can download the WPF toolkit &lt;a href="http://wpf.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=29117"&gt;here&lt;/a&gt;. Download the WPFToolkitBinariesAndSource zip file and unzip it. Install the toolkit by running the installation program in the binaries file. Include the &lt;em&gt;“Controls.DataVisualization.Toolkit.csproj”&lt;/em&gt; that is in the folder “&lt;em&gt;WPFToolkitBinariesAndSource\Toolkit-release\DataVisualization”&lt;/em&gt; of the toolkit and make a reference to the project in all the projects of the solution.&lt;/span&gt;

&lt;br /&gt;
This program was created in the Clinical Neurophysiology department of the &lt;a href="http://www.lumc.nl/home/?setlanguage=English&amp;amp;setcountry=en"&gt;Leiden University Medical Centre&lt;/a&gt; in the Netherlands.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7109267400150843396-6255921814398931774?l=reyntjes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reyntjes.blogspot.com/feeds/6255921814398931774/comments/default' title='Reacties plaatsen'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7109267400150843396&amp;postID=6255921814398931774' title='2 reacties'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7109267400150843396/posts/default/6255921814398931774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7109267400150843396/posts/default/6255921814398931774'/><link rel='alternate' type='text/html' href='http://reyntjes.blogspot.com/2009/09/freeing-axes-of-microsoft-toolkit.html' title='Freeing the axes of the Microsoft toolkit charting control'/><author><name>Robert</name><uri>http://www.blogger.com/profile/05660555650840919887</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_GFw1SxNbrEs/Sq-ls1oaunI/AAAAAAAAEaE/1UvYpcXIuFk/s72-c/Eeg_thumb2.jpg?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7109267400150843396.post-2080031096208229813</id><published>2009-07-10T03:09:00.001-07:00</published><updated>2010-06-02T12:19:18.416-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='viewmodel'/><category scheme='http://www.blogger.com/atom/ns#' term='wpf'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='fluidkit'/><title type='text'>A viewmodel for the fluidkit transition control</title><content type='html'>I was trying to create a program that has several pages with only one page visible at a time. If you want to see another page you should press a button with the name of that page. &lt;br /&gt;
The first thing I tried was using a TabControl. The problem with the TabControl was that each time you left a page the page would be unloaded. This is not the behaviour I wanted. The pages should stay in memory even when they aren’t visible. I searched for a solution and found this &lt;a href="http://eric.burke.name/dotnetmania/2009/04/26/22.09.28"&gt;blog entry&lt;/a&gt; that described an extension to the tabcontrol called TabControlEx. I tried it out and indeed the items in the tab stayed in memory, but I couldn’t get it to work the way I wanted it.&lt;br /&gt;
Then I remembered the &lt;a href="http://fluidkit.codeplex.com/"&gt;fluidkit library&lt;/a&gt; created by P&lt;span style="color: black;"&gt;avan Podila&lt;/span&gt;. This library has a class called TransitionPresenter that derives from ItemsControl. You can make a slideshow with the items you add to this control. The items you add stay in memory when they aren’t shown on screen. Because I always try to write my programs with the MVVM pattern I looked for a viewmodel for this class. I found a &lt;a href="http://www.japf.fr/?p=182"&gt;blog entry&lt;/a&gt; by Jeremy Alles who extended the TransitionPresenter and created a viewmodel for his newly created class. The strange thing was that his new class loaded the visible pages and unloaded the invisible pages. I tried to change this behaviour in his class but couldn’t figure out what happened and gave up.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;After my failed attempts with the TabControl and TabControlEx I decided to create my own viewmodel for the TransitionPresenter class. It turned out that the solution was relative easy. First I had to extend the TransitionPresenter class. I used attached properties to extend the behaviour of the TransitionPresenter class. I basically added one new attached dependency property. When you set the property called WorkSpaceNumber there will be a transition to the slide with this index number. If the index of the new slide is higher than the old one the transition animation will make a forward movement if the index is lower the transition will go backward. The static behaviour class you can see below:&lt;br /&gt;
&lt;span class="fullpost"&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&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;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;TransitionPresenterBehaviour&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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;int&lt;/span&gt; GetWorkspaceNumber(&lt;span style="color: #2b91af;"&gt;DependencyObject&lt;/span&gt; obj)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; (&lt;span style="color: blue;"&gt;int&lt;/span&gt;)obj.GetValue(WorkspaceNumberProperty);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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; SetWorkspaceNumber(&lt;span style="color: #2b91af;"&gt;DependencyObject&lt;/span&gt; obj, &lt;span style="color: blue;"&gt;int&lt;/span&gt; value)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; obj.SetValue(WorkspaceNumberProperty, value);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// Using a DependencyProperty as the backing store for WorkspaceNumber.&amp;nbsp; This enables animation, styling, binding, etc...&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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;readonly&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DependencyProperty&lt;/span&gt; WorkspaceNumberProperty =&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;DependencyProperty&lt;/span&gt;.RegisterAttached(&lt;span style="color: #a31515;"&gt;"WorkspaceNumber"&lt;/span&gt;, &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: blue;"&gt;int&lt;/span&gt;),&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;TransitionPresenterBehaviour&lt;/span&gt;),&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;UIPropertyMetadata&lt;/span&gt;(-1, OnIndexChanged));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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; OnIndexChanged(&lt;span style="color: #2b91af;"&gt;DependencyObject&lt;/span&gt; d, &lt;span style="color: #2b91af;"&gt;DependencyPropertyChangedEventArgs&lt;/span&gt; e)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;TransitionPresenter&lt;/span&gt; tp = (&lt;span style="color: #2b91af;"&gt;TransitionPresenter&lt;/span&gt;)d;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; newIndex = (&lt;span style="color: blue;"&gt;int&lt;/span&gt;)e.NewValue;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; oldIndex = (&lt;span style="color: blue;"&gt;int&lt;/span&gt;)e.OldValue;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;FrameworkElement&lt;/span&gt; elNew = (&lt;span style="color: #2b91af;"&gt;FrameworkElement&lt;/span&gt;)tp.ItemContainerGenerator.ContainerFromItem(tp.Items[newIndex]);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;FrameworkElement&lt;/span&gt; elOld = (oldIndex &amp;gt; -1) ?&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;span style="color: #2b91af;"&gt;FrameworkElement&lt;/span&gt;)tp.ItemContainerGenerator.ContainerFromItem(tp.Items[oldIndex]) : elNew;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (elNew != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;TransitionPresenterBehaviour&lt;/span&gt;.SetForWard(tp,newIndex &amp;gt; oldIndex);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tp.ApplyTransition(elOld, elNew);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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;bool&lt;/span&gt; GetForWard(&lt;span style="color: #2b91af;"&gt;DependencyObject&lt;/span&gt; obj)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; (&lt;span style="color: blue;"&gt;bool&lt;/span&gt;)obj.GetValue(ForWardProperty);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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; SetForWard(&lt;span style="color: #2b91af;"&gt;DependencyObject&lt;/span&gt; obj, &lt;span style="color: blue;"&gt;bool&lt;/span&gt; value)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; obj.SetValue(ForWardProperty, value);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// Using a DependencyProperty as the backing store for ForWard.&amp;nbsp; This enables animation, styling, binding, etc...&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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;readonly&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DependencyProperty&lt;/span&gt; ForWardProperty =&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;DependencyProperty&lt;/span&gt;.RegisterAttached(&lt;span style="color: #a31515;"&gt;"ForWard"&lt;/span&gt;, &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: blue;"&gt;bool&lt;/span&gt;), &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;TransitionPresenterBehaviour&lt;/span&gt;),&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;UIPropertyMetadata&lt;/span&gt;(&lt;span style="color: blue;"&gt;false&lt;/span&gt;, ForwardChanged));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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; ForwardChanged(&lt;span style="color: #2b91af;"&gt;DependencyObject&lt;/span&gt; d,&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;DependencyPropertyChangedEventArgs&lt;/span&gt; e)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;TransitionPresenter&lt;/span&gt; tp = (&lt;span style="color: #2b91af;"&gt;TransitionPresenter&lt;/span&gt;)d;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; forwardChanged(tp,(&lt;span style="color: blue;"&gt;bool&lt;/span&gt;)e.OldValue, (&lt;span style="color: blue;"&gt;bool&lt;/span&gt;)e.NewValue);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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; forwardChanged(&lt;span style="color: #2b91af;"&gt;TransitionPresenter&lt;/span&gt; tp, &lt;span style="color: blue;"&gt;bool&lt;/span&gt; oldRot, &lt;span style="color: blue;"&gt;bool&lt;/span&gt; newRot)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (oldRot == newRot)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; ;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (tp.Transition &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SlideTransition&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (tp.Transition &lt;span style="color: blue;"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SlideTransition&lt;/span&gt;).Direction = (newRot) ? &lt;span style="color: #2b91af;"&gt;Direction&lt;/span&gt;.LeftToRight : &lt;span style="color: #2b91af;"&gt;Direction&lt;/span&gt;.RightToLeft;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (tp.Transition &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CubeTransition&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (tp.Transition &lt;span style="color: blue;"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CubeTransition&lt;/span&gt;).Rotation = (newRot) ? &lt;span style="color: #2b91af;"&gt;Direction&lt;/span&gt;.LeftToRight : &lt;span style="color: #2b91af;"&gt;Direction&lt;/span&gt;.RightToLeft;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (tp.Transition &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FlipTransition&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (tp.Transition &lt;span style="color: blue;"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FlipTransition&lt;/span&gt;).Rotation = (newRot) ? &lt;span style="color: #2b91af;"&gt;Direction&lt;/span&gt;.LeftToRight : &lt;span style="color: #2b91af;"&gt;Direction&lt;/span&gt;.RightToLeft;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (tp.Transition &lt;span style="color: blue;"&gt;is&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;GenieTransition&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (tp.Transition &lt;span style="color: blue;"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;GenieTransition&lt;/span&gt;).EffectType = (newRot) ? &lt;span style="color: #2b91af;"&gt;GenieEffectType&lt;/span&gt;.IntoLamp : &lt;span style="color: #2b91af;"&gt;GenieEffectType&lt;/span&gt;.OutOfLamp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
In the OnIndexChanged method the actual transition happens. Before the transition the program checks if the new index is higher than the old one. If this is the case a forward transition is shown otherwise a backward one.&lt;br /&gt;
The viewmodel for the TransitionPresenterEx class I called FluidViewModel. It is derived it from MainWindowViewModel, a class that Josh Smith describes in &lt;a href="http://msdn.microsoft.com/en-us/magazine/dd419663.aspx"&gt;this article&lt;/a&gt;. I made a few changes to this class and it’s underlying classes. I described some of these changes in my previous blogs &lt;a href="http://reyntjes.blogspot.com/2009/04/master-detail-viewmodel_24.html"&gt;here&lt;/a&gt; and &lt;a href="http://reyntjes.blogspot.com/2009/06/viewmodel-for-observablecollection.html"&gt;here&lt;/a&gt;. The source code for the FluidViewModel looks like this: &lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; A viewmodel for the fluidkit transitionpresenter class.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FluidViewModel&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;MainWindowViewModel&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Initializes a new instance of the &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;see cref="FluidViewModel"/&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt; class.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; FluidViewModel(): &lt;span style="color: blue;"&gt;base&lt;/span&gt;()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._collectionView.CurrentChanged += &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;EventHandler&lt;/span&gt;(_collectionView_CurrentChanged);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._collectionView.Refresh();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Handles the CurrentChanged event of the _collectionView control.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;param name="sender"&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;The source of the event.&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;param name="e"&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;The &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;see cref="System.EventArgs"/&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt; instance containing the event data.&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; _collectionView_CurrentChanged(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; to = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Workspaces.IndexOf(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.ActiveWorkSpace);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// to update the Direction property&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WorkspaceNumber=to;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; forward;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Gets or sets the direction in which the pages slide.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;The direction.&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; Forward&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.forward;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.forward = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RaisePropertyChanged(() =&amp;gt; Forward);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; workspaceNumber=-1, oldWorkspaceNr;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Gets or sets the workspace number.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;The workspace number.&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; WorkspaceNumber&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.workspaceNumber;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oldWorkspaceNr = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.workspaceNumber;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.workspaceNumber = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// check the orientation of the change made by the user&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Forward = (&lt;span style="color: blue;"&gt;this&lt;/span&gt;.oldWorkspaceNr &amp;lt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.workspaceNumber);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (workspaceNumber != oldWorkspaceNr)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RaisePropertyChanged(() =&amp;gt; WorkspaceNumber);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Creates the commands.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;returns a list of commands&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;CommandViewModel&lt;/span&gt;&amp;gt; CreateCommands()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;CommandViewModel&lt;/span&gt;&amp;gt; commands = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;CommandViewModel&lt;/span&gt;&amp;gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;WorkspaceViewModel&lt;/span&gt; ws &lt;span style="color: blue;"&gt;in&lt;/span&gt; Workspaces)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; commands.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CommandViewModel&lt;/span&gt;(ws.DisplayName, ws.ShowCommand));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; commands;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;/div&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;/div&gt;
There is a property called WorkSpaceNumber with which you can get and set the currently selected slide. The Forward property is set to true if the old workspace number is smaller than the new workspace number.&amp;nbsp; The CreateCommands method is an abstract method of the MainWindowViewModel and create a list of commands in the FluidViewModel that are used to show the workspace if executed.&lt;br /&gt;
As an example I created a small program with two images and two buttons. First a viewmodel for the main window of the program must be created. This is now very simple:&lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ImagesViewModel&lt;/span&gt;:&lt;span style="color: #2b91af;"&gt;FluidViewModel&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Image1ViewModel&lt;/span&gt; image1;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Image1ViewModel&lt;/span&gt; Image1&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; image1; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; image1 = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RaisePropertyChanged(() =&amp;gt; Image1);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Image2ViewModel&lt;/span&gt; image2;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Image2ViewModel&lt;/span&gt; Image2&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; image2; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; image2 = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RaisePropertyChanged(() =&amp;gt; Image2);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; ImagesViewModel()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; image1 = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Image1ViewModel&lt;/span&gt;(&lt;span style="color: blue;"&gt;this&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; image2 = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Image2ViewModel&lt;/span&gt;(&lt;span style="color: blue;"&gt;this&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Workspaces.Add(image1);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Workspaces.Add(image2);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;/div&gt;
Image1ViewModel and Image2ViewModel are both derived from the WorkspacesViewModel and are added to the list of workspaces of the MainWindowViewModel in the constructor. &lt;br /&gt;Connecting the ImagesViewModel to the TransitionPresenterEx control is now very easy. An example you can see in the xaml code below:&lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;DockPanel&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;ListBox&lt;/span&gt;&lt;span style="color: red;"&gt; DockPanel.Dock&lt;/span&gt;&lt;span style="color: blue;"&gt;="Top"&lt;/span&gt;&lt;span style="color: red;"&gt; ItemsSource&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;=Commands}"&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt; ItemTemplate&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;StaticResource&lt;/span&gt;&lt;span style="color: red;"&gt; CommandsTemplate&lt;/span&gt;&lt;span style="color: blue;"&gt;}"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;ListBox&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;ContentControl&lt;/span&gt;&lt;span style="color: red;"&gt; Name&lt;/span&gt;&lt;span style="color: blue;"&gt;="workspacesContent"&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt;                   Content&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: blue;"&gt;}"&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt;                   ContentTemplate&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;StaticResource&lt;/span&gt;&lt;span style="color: red;"&gt; WorkspacesTemplate&lt;/span&gt;&lt;span style="color: blue;"&gt;}"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;DockPanel&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
On top is a listbox. The ItemsSource property of the listbox binds to the Commands property of the FluidViewModel. A DataTemplate called CommandsTemplate changes the commands into buttons that hold the ShowCommand commands.&lt;br /&gt;The datatemplate called WorkspacesTemplate changes the ImagesViewModel in a TransionPresenterEx object. &lt;br /&gt;The most important datatemplates and styles that are used you can see below:&lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color: red;"&gt; DataType&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;x&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Type&lt;/span&gt;&lt;span style="color: red;"&gt; vm&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;Image1ViewModel&lt;/span&gt;&lt;span style="color: blue;"&gt;}"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;vw&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Image1Control&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color: red;"&gt; DataType&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;x&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Type&lt;/span&gt;&lt;span style="color: red;"&gt; vm&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;Image2ViewModel&lt;/span&gt;&lt;span style="color: blue;"&gt;}"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;vw&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Image2Control&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color: red;"&gt; x&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;Key&lt;/span&gt;&lt;span style="color: blue;"&gt;="CommandsTemplate"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Button&lt;/span&gt;&lt;span style="color: red;"&gt; Command&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;=Command}"&lt;/span&gt;&lt;span style="color: red;"&gt; Content&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;=DisplayName}"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Button&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;fl&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: #a31515;"&gt;SlideTransition&lt;/span&gt;&lt;span style="color: red;"&gt; x&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;Key&lt;/span&gt;&lt;span style="color: blue;"&gt;="SlideTransition" /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color: red;"&gt; x&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;Key&lt;/span&gt;&lt;span style="color: blue;"&gt;="WorkspacesTemplate" &amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;fl&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: #a31515;"&gt;TransitionPresenter&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt; RestDuration&lt;/span&gt;&lt;span style="color: blue;"&gt;="0:0:3"&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Transition&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;StaticResource&lt;/span&gt;&lt;span style="color: red;"&gt; SlideTransition&lt;/span&gt;&lt;span style="color: blue;"&gt;}"&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt; ItemsSource&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;=Workspaces}"&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt; vw&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;TransitionPresenterBehaviour.WorkspaceNumber&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;=WorkspaceNumber}"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;fl&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: #a31515;"&gt;TransitionPresenter&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
The source code you can download &lt;a href="http://sites.google.com/site/projectsincsharp/Home/my-files/FluidViewModel.zip?attredirects=0"&gt;here&lt;/a&gt;. You also have to download the fluidkit library &lt;a href="http://fluidkit.codeplex.com/SourceControl/ListDownloadableCommits.aspx"&gt;here&lt;/a&gt; and make a reference to it in the demonstration program. Below you can see an image of the program.&lt;br /&gt;
&lt;a href="http://lh5.ggpht.com/_GFw1SxNbrEs/SlcTXMtlanI/AAAAAAAAEXQ/xV73gYVbMs8/s1600-h/image%5B2%5D.png"&gt;&lt;img alt="image" border="0" height="244" src="http://lh3.ggpht.com/_GFw1SxNbrEs/SlcTXviJiPI/AAAAAAAAEXU/PCgcSOGeWq8/image_thumb.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="243" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7109267400150843396-2080031096208229813?l=reyntjes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reyntjes.blogspot.com/feeds/2080031096208229813/comments/default' title='Reacties plaatsen'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7109267400150843396&amp;postID=2080031096208229813' title='4 reacties'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7109267400150843396/posts/default/2080031096208229813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7109267400150843396/posts/default/2080031096208229813'/><link rel='alternate' type='text/html' href='http://reyntjes.blogspot.com/2009/07/viewmodel-for-fluidkit-transition.html' title='A viewmodel for the fluidkit transition control'/><author><name>Robert</name><uri>http://www.blogger.com/profile/05660555650840919887</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_GFw1SxNbrEs/SlcTXviJiPI/AAAAAAAAEXU/PCgcSOGeWq8/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7109267400150843396.post-245830292121962495</id><published>2009-06-04T07:11:00.000-07:00</published><updated>2010-06-02T12:19:44.429-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='viewmodel'/><category scheme='http://www.blogger.com/atom/ns#' term='ObservableCollection'/><category scheme='http://www.blogger.com/atom/ns#' term='wpf'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>A Viewmodel for the ObservableCollection</title><content type='html'>&lt;h3&gt;

Introduction&lt;/h3&gt;
In my &lt;a href="http://reyntjes.blogspot.com/2009/04/master-detail-viewmodel_24.html"&gt;previous post&lt;/a&gt; I wrote about the MasterDetailViewModel. A viewmodel for the navigation of master-detail tables. I briefly mentioned you could extend its base class, the NavigationViewModel class, and create a viewmodel for an ObservableCollection. In this post I will describe such a viewmodel that I called the ObservableViewModel, and give an example of its usage. Because the ObservableViewModel shared a lot of functionality with the MasterDetailViewModel an intermediate viewmodel called CollectionViewModel is needed. The class diagram of the viewmodels now looks like the figure below:

&lt;a href="http://lh6.ggpht.com/_GFw1SxNbrEs/SiQ_MsubG5I/AAAAAAAABsA/yj431ATeyDU/s1600-h/image12%5B1%5D.png"&gt;&lt;img alt="image" border="0" height="408" src="http://lh4.ggpht.com/_GFw1SxNbrEs/SiQ_NUzyQAI/AAAAAAAABsE/ILw0o_q1AZ0/image12_thumb.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" width="657" /&gt;&lt;/a&gt;
&lt;span class="fullpost"&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;&lt;a name='more'&gt;&lt;/a&gt;When I first started learning about the Model-View-ViewModel (MVVM) pattern, I saw &lt;a href="http://blog.lab49.com/archives/2650"&gt;this video&lt;/a&gt; of Jason Dollinger on how to create a program with such a pattern. I wanted to have a close look at the code to see how everything worked. But there was no source code available so I &lt;a href="http://reyntjes.blogspot.com/2008/12/my-version-of-jason-dollingers.html"&gt;recreated the code&lt;/a&gt; by watching the video.  I will use a changed version of this program to demonstrate the ObservableViewModel.





&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;&lt;h3&gt;

The CollectionViewModel&lt;/h3&gt;
In my &lt;a href="http://reyntjes.blogspot.com/2009/04/master-detail-viewmodel_24.html"&gt;previous post&lt;/a&gt; about the Master-Detail ViewModel I already described the NavigationViewModel and explained that it is an abstract class that holds all the commands to navigate through a collection and change it. The CollectionViewModel is derived from it and the  most important job for this class is to hold a property called ViewSource of type &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource(VS.100).aspx"&gt;CollectionViewSource&lt;/a&gt;. CollectionViewSource has a &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource.view.aspx"&gt;View&lt;/a&gt; property that holds the actual view and a &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource.source.aspx"&gt;Source&lt;/a&gt; property that holds the source collection. The View property is of type ICollectionView. The microsoft documentation says about it: You can think of a collection view as a layer on top of a binding source collection that allows you to navigate and display the collection based on sort, filter, and group queries, all without having to manipulate the underlying source collection itself.







&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;        ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        ///&lt;span style="color: green;"&gt; Gets the view source.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;/summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;value&amp;gt;&lt;span style="color: green;"&gt;The view source.&lt;/span&gt;&amp;lt;/value&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CollectionViewSource&lt;/span&gt; ViewSource { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;set&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        ///&lt;span style="color: green;"&gt; Gets the View of the ViewSource.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;/summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ICollectionView&lt;/span&gt; IView { &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; ViewSource.View; } }&lt;/pre&gt;
&lt;/div&gt;
So IView just returns ViewSource’s View property and is primarily used to shorten notation.

The MasterDetailViewModel derives from the CollectionViewModel and has a property called View of type &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.bindinglistcollectionview.aspx"&gt;BindingListCollectionView&lt;/a&gt;. &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.bindinglistcollectionview.aspx"&gt;BindingListCollectionView&lt;/a&gt; is the default view for collections that implement &lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.ibindinglistview.aspx"&gt;IBindingListView&lt;/a&gt; or &lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.ibindinglist.aspx"&gt;IBindingList&lt;/a&gt;. The source code from the MasterDetailViewModel for this View property looks like this:





&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;        ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        ///&lt;span style="color: green;"&gt; Gets the view.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;/summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;value&amp;gt;&lt;span style="color: green;"&gt;The view.&lt;/span&gt;&amp;lt;/value&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;BindingListCollectionView&lt;/span&gt; View { &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;BindingListCollectionView&lt;/span&gt;)IView; } }&lt;/pre&gt;
&lt;/div&gt;
&lt;h3&gt;

The ObservableViewModel&lt;/h3&gt;
The ObservableViewModel derives from the CollectionViewModel. Its View property is of type &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.listcollectionview.aspx"&gt;ListCollectionView&lt;/a&gt; this type is the default view for collections that implement &lt;a href="http://msdn.microsoft.com/en-us/library/system.collections.ilist.aspx"&gt;IList&lt;/a&gt;. The code for this property you see below:





&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;        ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        ///&lt;span style="color: green;"&gt; Gets the view.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;/summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;value&amp;gt;&lt;span style="color: green;"&gt;The view.&lt;/span&gt;&amp;lt;/value&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ListCollectionView&lt;/span&gt; View { &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;ListCollectionView&lt;/span&gt;)IView; } }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;/div&gt;
You see it just returns ViewSource’s View property as a ListCollectionView.

The ObservableViewModel also implements the add and remove commands of the NavigationViewModel. The ICollectionView type doesn’t have Add and Remove methods. But the ListCollectionView and BindingListCollectionView have them so they can only be implemented in the ObservableViewModel.





&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;

Implementation example: A watch list for stock quotes&lt;/h3&gt;
As I said in the introduction I will change the source code of the original stock quote watch list program by Jason Dollinger so that it will implement the ObservableViewModel. The original program just had a subscribe button. For that button a subscribe command was created. This command is now replaced with the add command of ObservableViewModel. I added a remove button so that a selected stock quote can be removed from the watch list. The Navigation commands like previous, next, first and last are commands that are part of the ObservableViewModel but are not implemented in my program.

The model of the MVVM pattern is an object of type RandomQuoteSource. This object creates stock quotes randomly and has an event called QuoteArrived that is raised every time a quote is created. The view of the program you see below.



&lt;a href="http://lh4.ggpht.com/_GFw1SxNbrEs/SibNe51mbQI/AAAAAAAABsQ/QaJKqbjJ3eo/s1600-h/image%5B2%5D.png"&gt;&lt;img alt="image" border="0" height="343" src="http://lh3.ggpht.com/_GFw1SxNbrEs/SiWQnAbh6bI/AAAAAAAABsU/EiGECvGTKic/image_thumb%5B1%5D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" width="476" /&gt;&lt;/a&gt;

The viewmodel is called WatchListViewModel and as you can see below has the ObservableViewModel as its base class.  In the constructor below you see that a qoute source of type IQuoteSource is passed in the constructor. The _quoteMap field is a dictionary that keeps track of the symbols that are used.







&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;    ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    ///&lt;span style="color: green;"&gt; Viewmodel for a watchlist of incoming stock quotes&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;/summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;WatchlistViewModel&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;ObservableViewModel&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Quote&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;QuoteViewModel&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;    {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: #2b91af;"&gt;IQuoteSource&lt;/span&gt; _source;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: #2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;Quote&lt;/span&gt;&amp;gt; _quoteMap = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;Quote&lt;/span&gt;&amp;gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: blue;"&gt;string&lt;/span&gt; _lastSymbol, _symbol, _deleteText;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        ///&lt;span style="color: green;"&gt; Initializes a new instance of the &lt;/span&gt;&amp;lt;see cref="WatchlistViewModel"/&amp;gt;&lt;span style="color: green;"&gt; class.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;/summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;param name="source"&amp;gt;&lt;span style="color: green;"&gt;The source of incoming stock quotes.&lt;/span&gt;&amp;lt;/param&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: blue;"&gt;public&lt;/span&gt; WatchlistViewModel(&lt;span style="color: #2b91af;"&gt;IQuoteSource&lt;/span&gt; source)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(&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: #2b91af;"&gt;Quote&lt;/span&gt;&amp;gt;())&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            _source = source;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            _source.QuoteArrived += &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Quote&lt;/span&gt;&amp;gt;(_sourceQuoteArrived);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            CollectionChanged += &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NotifyCollectionChangedEventHandler&lt;/span&gt;(WatchlistViewModel_CollectionChanged);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            CurrentChanged += &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;CurrentChangedArgs&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Quote&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;QuoteViewModel&lt;/span&gt;&amp;gt;&amp;gt;(WatchlistViewModel_CurrentChanged);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        }&lt;/pre&gt;
&lt;/div&gt;
You can see the method connected to the CollectionChanged event of the ObservableViewModel below. When items are added to the collection the quote source is notified that it should create a new quote source and if the symbol doesn’t already exist a new symbol is added to the _quoteMap field. When items are removed they also are removed in the quote source and in the _quoteMap dictionary.



&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;        ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        ///&lt;span style="color: green;"&gt; Handles the CollectionChanged event of the WatchlistViewModel object.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;/summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;param name="sender"&amp;gt;&lt;span style="color: green;"&gt;The source of the event.&lt;/span&gt;&amp;lt;/param&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;param name="e"&amp;gt;&lt;span style="color: green;"&gt;The &lt;/span&gt;&amp;lt;see cref="System.Collections.Specialized.NotifyCollectionChangedEventArgs"/&amp;gt;&lt;span style="color: green;"&gt; instance containing the event data.&lt;/span&gt;&amp;lt;/param&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        &lt;span style="color: blue;"&gt;void&lt;/span&gt; WatchlistViewModel_CollectionChanged(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, System.Collections.Specialized.&lt;span style="color: #2b91af;"&gt;NotifyCollectionChangedEventArgs&lt;/span&gt; e)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            &lt;span style="color: blue;"&gt;switch&lt;/span&gt; (e.Action)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                &lt;span style="color: blue;"&gt;case&lt;/span&gt; System.Collections.Specialized.&lt;span style="color: #2b91af;"&gt;NotifyCollectionChangedAction&lt;/span&gt;.Add:&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                    &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;object&lt;/span&gt; item &lt;span style="color: blue;"&gt;in&lt;/span&gt; e.NewItems)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                    {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                        &lt;span style="color: #2b91af;"&gt;Quote&lt;/span&gt; q = (&lt;span style="color: #2b91af;"&gt;Quote&lt;/span&gt;)item;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                        _source.Subscribe(&lt;span style="color: blue;"&gt;this&lt;/span&gt;.Symbol);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                        q.Symbol = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Symbol;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                        &lt;span style="color: blue;"&gt;this&lt;/span&gt;.LastSymbol = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Symbol;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                        &lt;span style="color: blue;"&gt;if&lt;/span&gt; (!_quoteMap.ContainsValue(q))&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                            _quoteMap.Add(q.Symbol, q);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                    }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                    &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                &lt;span style="color: blue;"&gt;case&lt;/span&gt; System.Collections.Specialized.&lt;span style="color: #2b91af;"&gt;NotifyCollectionChangedAction&lt;/span&gt;.Remove:&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                    &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;object&lt;/span&gt; item &lt;span style="color: blue;"&gt;in&lt;/span&gt; e.OldItems)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                    {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                        &lt;span style="color: #2b91af;"&gt;Quote&lt;/span&gt; q = (&lt;span style="color: #2b91af;"&gt;Quote&lt;/span&gt;)item;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                        _source.UnSubscribe(q.Symbol);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                        _quoteMap.Remove(q.Symbol);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                    }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                    &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                &lt;span style="color: blue;"&gt;default&lt;/span&gt;:&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;                    &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;            }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;h3&gt;

Remarks&lt;/h3&gt;
&lt;/span&gt;&lt;span class="fullpost"&gt;When you compare the WatchListViewModel with the &lt;a href="http://reyntjes.blogspot.com/2008/12/my-version-of-jason-dollingers.html"&gt;original viewmodel&lt;/a&gt; you don’t see much change in the amount of code. But don’t forget that you have the navigation commands at you disposal now. Furthermore it becomes easy to add sorting, filtering and grouping capabilities to the view.

I noticed I didn’t explain the ItemViewModel much in this post and the previous post about the Master-Detail ViewModel. For now you should know that viewmodels that derive from IItemViewModel have an Item property that always is the currently selected item in a collection. I think I will change the stock quote program to demonstrate its usage. The application will get a datagrid. A datagrid in WPF has an interesting feature called RowDetails which is an area of customizable content beneath each row. When you select an item in the datagrid the RowDetails will show. It would be nice to then show a graph of the stock quotes in the RowDetails. The QuoteViewModel which has an ItemViewModel as its base class will handle this behaviour. So expect an update of this article.

You can find the source code &lt;a href="http://sites.google.com/site/projectsincsharp/Home/my-files/CollectionMVVM.zip?attredirects=0"&gt;here&lt;/a&gt;.
&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;Update&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;2-3-2010&lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;I have an updated .net 4 version of this code. It includes a chart that is displayed in the rowdetails. You can download it &lt;a href="http://cid-afcd5b1add70daac.skydrive.live.com/self.aspx/Public/CollectionMVVM4.zip"&gt;here&lt;/a&gt;&amp;nbsp;It is not tested on another computer so please report any problems to me.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7109267400150843396-245830292121962495?l=reyntjes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reyntjes.blogspot.com/feeds/245830292121962495/comments/default' title='Reacties plaatsen'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7109267400150843396&amp;postID=245830292121962495' title='1 reacties'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7109267400150843396/posts/default/245830292121962495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7109267400150843396/posts/default/245830292121962495'/><link rel='alternate' type='text/html' href='http://reyntjes.blogspot.com/2009/06/viewmodel-for-observablecollection.html' title='A Viewmodel for the ObservableCollection'/><author><name>Robert</name><uri>http://www.blogger.com/profile/05660555650840919887</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_GFw1SxNbrEs/SiQ_NUzyQAI/AAAAAAAABsE/ILw0o_q1AZ0/s72-c/image12_thumb.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7109267400150843396.post-436398532610339741</id><published>2009-04-24T13:45:00.000-07:00</published><updated>2010-06-02T12:20:19.221-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='viewmodel'/><category scheme='http://www.blogger.com/atom/ns#' term='wpf'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>A Master-Detail ViewModel</title><content type='html'>&lt;h3&gt;
Introduction&lt;/h3&gt;
A while ago I attempted to write a Master/Detail viewmodel . The result you can find &lt;a href="http://reyntjes.blogspot.com/2009/04/creating-masterdetail-viewmodel.html"&gt;here&lt;/a&gt;. This article was a reaction on a video Beth Massi showed &lt;a href="http://msdn.microsoft.com/en-us/vbasic/dd239277.aspx"&gt;here&lt;/a&gt;. It’s a very nice tutorial on how to create a master-detail data entry form in WPF. However you have to type quite a lot of code each time you want to create your master-detail forms. So I thought I should write a viewmodel that does most of the work. My first attempt worked pretty good but since then I read some wonderful WPF articles like &lt;a href="http://msdn.microsoft.com/en-us/magazine/dd419663.aspx"&gt;this one&lt;/a&gt; of Josh Smith. In it he describes some viewmodels that can be used as base classes for my own viewmodels.   &lt;br /&gt;
&lt;span class="fullpost"&gt;   &lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;    &lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;&lt;h3&gt;
The ViewModelBase base class&lt;/h3&gt;
Below you see a diagram of all the viewmodels I use in this article.     &lt;br /&gt;&lt;img alt="image" src="http://lh4.ggpht.com/_GFw1SxNbrEs/SiQ_NUzyQAI/AAAAAAAABsE/ILw0o_q1AZ0/image12_thumb.png?imgmax=800" style="display: block; float: none; margin-left: auto; margin-right: auto;" /&gt;     &lt;br /&gt;The base class for all viewmodels is the ViewModelBase class. I changed the base class of Josh Smith a little because I don’t like using strings in my code. The base class uses the INotifyPropertyChanged interface and every property that changes its value can notify the change by calling a function like:     &lt;br /&gt;    &lt;br /&gt;
&lt;pre&gt;&lt;br /&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;OnPropertyChanged("&lt;span style="color: darkred;"&gt;Position&lt;/span&gt;")&lt;/pre&gt;
&lt;/pre&gt;
The code would look nicer and you wouldn’t get runtime errors if you typed a string wrong if the code would look like this. 

  &lt;br /&gt;

  &lt;br /&gt;
&lt;pre&gt;&lt;br /&gt;
&lt;pre style="background-color: #fbfbfb; font-family: consolas,'Courier New',courier,monospace; font-size: 12px; margin: 0em; width: 100%;"&gt;RaisePropertyChanged(() =&amp;gt; Position);&lt;/pre&gt;
&lt;/pre&gt;
You can do this by using expression trees. I copied the code for this from an Italian blog by &lt;a href="http://blogs.ugidotnet.org/bmatte/archive/2008/11/28/pattern-model-view-viewmodel-inotifypropertychanged-static-reflection-e-extension-methods.aspx"&gt;this guy&lt;/a&gt;, but more people posted code like this. First he uses an extension method: &lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PropertyExtensions&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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;PropertyChangedEventArgs&lt;/span&gt; CreateChangeEventArgs&amp;lt;T&amp;gt;(&lt;span style="color: blue;"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T&amp;gt;&amp;gt; property)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; expression = property.Body &lt;span style="color: blue;"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MemberExpression&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; member = expression.Member;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PropertyChangedEventArgs&lt;/span&gt;(member.Name);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
The function below must now be added to the base class:&lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; RaisePropertyChanged&amp;lt;T&amp;gt;(&lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T&amp;gt;&amp;gt; property)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;PropertyChangedEventHandler&lt;/span&gt; handler = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.PropertyChanged;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (handler != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; handler(&lt;span style="color: blue;"&gt;this&lt;/span&gt;, property.CreateChangeEventArgs());&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;/div&gt;
Every viewmodel that derives from the base class can now call the RaisePropertyChanged method with a property as its parameter. The property name will pop up now in the method parameter thanks to Intellisense. 
    &lt;br /&gt;
&lt;h3&gt;
NavigationViewModel&lt;/h3&gt;
The Master-Detail viewmodel will derive from the NavigationViewModel and can be used by all kind of collections. I created the NavigationViewModel so that you can also use it as a base class for viewmodels that manipulate lists and observable collections. The NavigationViewModel is an abstract class that has all the commands to change and move through a collection. Also there’s a property for the position of the current item and the number of items in a collection. The NavigationViewModel creates a collection of CommandViewModels. I changed the CommandViewModel from Josh Smith’s article. My CommandViewModel now has properties for images and tooltips, and looks more like the &lt;a href="http://windowsclient.net/wpf/wpf35/wpf-35sp1-ribbon-walkthrough.aspx#commands"&gt;RibbonCommand&lt;/a&gt; in the &lt;a href="http://wpf.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=25047"&gt;wpf toolkit&lt;/a&gt;. In the example program these extra properties aren’t used by the way. If you look at the code below you see that the property NavigationViewModels is a list of all the commands in the NavigationViewModel. If you look at the CreateCommands method you’ll notice that the third viewmodel in the command list is the NavigationViewModel itself. This is used in the WPF NavigationControl to show the position of the current selected item and the number of items.&lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; ViewModel for navigating and manipulating collections&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;NavigationViewModel&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;ViewModelBase&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;INavigationViewModel&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;ObservableCollection&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;ViewModelBase&lt;/span&gt;&amp;gt; _navigationViewModels;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Initializes a new instance of the &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;see cref="NavigationViewModel"/&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt; class.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; NavigationViewModel()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VisibleCommandText = &lt;span style="color: blue;"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Gets the viewmodels of the &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;see cref="NavigationViewModel"/&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;The &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;see cref="NavigationViewModel"/&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt; viewmodels.&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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;ViewModelBase&lt;/span&gt;&amp;gt; NavigationViewModels&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (_navigationViewModels == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;ViewModelBase&lt;/span&gt;&amp;gt; cmds = &lt;span style="color: blue;"&gt;this&lt;/span&gt;.CreateCommands();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _navigationViewModels = &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: #2b91af;"&gt;ViewModelBase&lt;/span&gt;&amp;gt;(cmds);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; _navigationViewModels;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Creates the CommandViewModels.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;a list of viewmodels&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;ViewModelBase&lt;/span&gt;&amp;gt; CreateCommands()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;ViewModelBase&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CommandViewModel&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"First"&lt;/span&gt;,FirstCommand,Properties.&lt;span style="color: #2b91af;"&gt;Resources&lt;/span&gt;.First_Small),&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CommandViewModel&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Previous"&lt;/span&gt;,PreviousCommand,Properties.&lt;span style="color: #2b91af;"&gt;Resources&lt;/span&gt;.Previous_Small),&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;, &lt;span style="color: green;"&gt;// The navigation view model itself lies between the previous and next CommandViewModel&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CommandViewModel&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Next"&lt;/span&gt;,NextCommand,Properties.&lt;span style="color: #2b91af;"&gt;Resources&lt;/span&gt;.Next_Small),&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CommandViewModel&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Last"&lt;/span&gt;,LastCommand,Properties.&lt;span style="color: #2b91af;"&gt;Resources&lt;/span&gt;.Last_Small),&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CommandViewModel&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Delete"&lt;/span&gt;,DeleteCommand,Properties.&lt;span style="color: #2b91af;"&gt;Resources&lt;/span&gt;.Cancel),&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CommandViewModel&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Add"&lt;/span&gt;, AddCommand, Properties.&lt;span style="color: #2b91af;"&gt;Resources&lt;/span&gt;.Add_Small)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region&lt;/span&gt; INavigationViewModel Members&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;RelayCommand&lt;/span&gt; _addCommand;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Gets the add command.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;The add command.&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ICommand&lt;/span&gt; AddCommand&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (_addCommand == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _addCommand = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;RelayCommand&lt;/span&gt;(param =&amp;gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.Add(),&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; param =&amp;gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.CanAdd);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; _addCommand;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Adds an item to the collection.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;abstract&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Add();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Gets a value indicating whether this instance can add an item.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;value&amp;gt;&amp;lt;c&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;true&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/c&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt; if this instance can add an item; otherwise, &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;c&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;false&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/c&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;.&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;abstract&lt;/span&gt; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; CanAdd { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; }&lt;/pre&gt;
&lt;/div&gt;
The rest of the class above looks more or less the same. All the command properties use a RelayCommand field with an Execute and CanExecute delegate. In the case of the AddCommand the Add method is the execute delegate and the CanAdd property is the CanExecute delegate. In the NavigationViewModel all of these delegates are abstract. 
    &lt;br /&gt;
&lt;h3&gt;
The NavigationControl&lt;/h3&gt;
In Windows Forms there is a NavigationControl for bindable collections. WPF doesn’t have a control for this yet. Because the NavigationViewModel has a list of navigation commands, creating one now becomes very easy. I created a new UserControl that should have an object derived from the NavigationViewModel as its DataContext. This control only has one ListBox. The ItemsSource binds to the NavigationViewModels property of the NavigationViewModel . If an item of the NavigationViewModels is of the CommandViewModel type, a button is created that binds to the CommandViewModel’s Command property. If an item is of type NavigationViewModel, a string is created that shows the number of items and the position of the currently selected item. It’s easy to create a textbox for the position field, so that you can type in the position you want to move to, but I had trouble aligning the position textbox and the count string. &lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;UserControl.Resources&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green;"&gt;&amp;lt;!--The standard DataTemplate for the CommandViewModel.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; This template has an image with underneath it the display name of the command--&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color: red;"&gt; DataType&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;x&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Type&lt;/span&gt;&lt;span style="color: red;"&gt; vm&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;CommandViewModel&lt;/span&gt;&lt;span style="color: blue;"&gt;}"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Button&lt;/span&gt;&lt;span style="color: red;"&gt; Command&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;=Command}"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color: red;"&gt; Orientation&lt;/span&gt;&lt;span style="color: blue;"&gt;="Vertical"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Image&lt;/span&gt;&lt;span style="color: red;"&gt; Height&lt;/span&gt;&lt;span style="color: blue;"&gt;="16"&lt;/span&gt;&lt;span style="color: red;"&gt; Width&lt;/span&gt;&lt;span style="color: blue;"&gt;="16"&lt;/span&gt;&lt;span style="color: red;"&gt; Source&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;=SmallImageSource}"/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color: red;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="color: blue;"&gt;="Center"&lt;/span&gt;&lt;span style="color: red;"&gt; Text&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;=DisplayName}"&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt; Visibility&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;=TextVisibility}"/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Button&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green;"&gt;&amp;lt;!--The standard DataTemplate for the NavigationViewModel.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; This template shows a text with the current position and the number of items of a collection--&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color: red;"&gt; DataType&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;x&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Type&lt;/span&gt;&lt;span style="color: red;"&gt; vm&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;NavigationViewModel&lt;/span&gt;&lt;span style="color: blue;"&gt;}"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color: blue;"&gt; &amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;TextBlock.Text&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;MultiBinding&lt;/span&gt;&lt;span style="color: red;"&gt; StringFormat&lt;/span&gt;&lt;span style="color: blue;"&gt;=" {0:D} of {1:D}"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;="Position"&lt;/span&gt;&lt;span style="color: red;"&gt; Mode&lt;/span&gt;&lt;span style="color: blue;"&gt;="OneWay" /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;="Count"&lt;/span&gt;&lt;span style="color: red;"&gt; Mode&lt;/span&gt;&lt;span style="color: blue;"&gt;="OneWay"/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;MultiBinding&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;TextBlock.Text&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green;"&gt;&amp;lt;!--The Style for the ListBox.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; The commands are shown horizontally stacked--&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Style&lt;/span&gt;&lt;span style="color: red;"&gt; TargetType&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;x&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Type&lt;/span&gt;&lt;span style="color: red;"&gt; ListBox&lt;/span&gt;&lt;span style="color: blue;"&gt;}"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Setter&lt;/span&gt;&lt;span style="color: red;"&gt; Property&lt;/span&gt;&lt;span style="color: blue;"&gt;="ItemsPanel"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Setter.Value&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;ItemsPanelTemplate&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color: red;"&gt; Orientation&lt;/span&gt;&lt;span style="color: blue;"&gt;="Horizontal"&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="color: blue;"&gt;="Top"&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="color: blue;"&gt;="Left"&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;ItemsPanelTemplate&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Setter.Value&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Setter&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Style&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;UserControl.Resources&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green;"&gt;&amp;lt;!--The listbox holding the viewmodels of the NavigationViewModel class--&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;ListBox&lt;/span&gt;&lt;span style="color: red;"&gt; Name&lt;/span&gt;&lt;span style="color: blue;"&gt;="commandListbox"&lt;/span&gt;&lt;span style="color: red;"&gt; ItemsSource&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;=NavigationViewModels}"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;ListBox&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
The navigation control now looks like this:&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&lt;a href="http://lh3.ggpht.com/_GFw1SxNbrEs/SfRxc9pPmrI/AAAAAAAABek/zN_3kjqAebY/s1600-h/Navigation%5B2%5D.png"&gt;&lt;img alt="Navigation" border="0" height="83" src="http://lh4.ggpht.com/_GFw1SxNbrEs/SfRxe2Fc-lI/AAAAAAAABeo/yjOhXIYQUeQ/Navigation_thumb.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="Navigation" width="236" /&gt;&lt;/a&gt; 

    &lt;br /&gt;
&lt;h3&gt;
The MasterDetailViewModel&lt;/h3&gt;
The MasterDetailViewModel uses the CollectionViewModel as its base class and implements the IMasterDetailViewModel interface. The CollectionViewModel is described in &lt;a href="http://reyntjes.blogspot.com/2009/06/viewmodel-for-observablecollection.html"&gt;this article&lt;/a&gt;. 

    &lt;br /&gt;The interface tells that each master-detail viewmodel holds a list of other master-detail viewmodels. Also each viewmodel has a property called ViewSource of type CollectionViewSource. 

    &lt;br /&gt;All the abstract methods and properties in the NavigationViewModel must now be implemented in this class. Below you see that the MasterDetailViewModel is a generic class that uses the NavigationViewModel as its base class. The class has a variable called CurrentItem of type T that holds the current selected item. The viewmodel of that selected item is of type V and must have the IItemViewModel&amp;lt;T&amp;gt; interface implemented.&lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; interface for the master detail viewmodel.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; Each master or detail viewmodel can have a number of detail view models.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; Each viewmodel has a property of type CollectionViewSource.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;/summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;interface&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IMasterDetailViewModel&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;IMasterDetailViewModel&lt;/span&gt;&amp;gt; Details { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Action&lt;/span&gt; OnMasterChanged { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;CollectionViewSource&lt;/span&gt; ViewSource { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; Viewmodel for master detail collections&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;/summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;typeparam name="T"&amp;gt;&lt;span style="color: green;"&gt;The type of items the collection holds&lt;/span&gt;&amp;lt;/typeparam&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;typeparam name="V"&amp;gt;&lt;span style="color: green;"&gt;The viewmodel of the items&lt;/span&gt;&amp;lt;/typeparam&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MasterDetailViewModel&lt;/span&gt;&amp;lt;T, V&amp;gt; : &lt;span style="color: #2b91af;"&gt;CollectionViewModel&lt;/span&gt;&amp;lt;T, V&amp;gt;, &lt;span style="color: #2b91af;"&gt;IMasterDetailViewModel&lt;/span&gt; &lt;span style="color: blue;"&gt;where&lt;/span&gt; V : &lt;span style="color: #2b91af;"&gt;IItemViewModel&lt;/span&gt;&amp;lt;T&amp;gt;, &lt;span style="color: blue;"&gt;new&lt;/span&gt;()&lt;/pre&gt;
&lt;/div&gt;
The equivalent of the BindingSource class in windows forms is the CollectionViewSource in WPF. This class has a Source property that holds the collection. There’s a View property that enables collections to have the functionalities of current record management. The constructors for creating the master-detail relation look like this. &lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; Initializes a new instance of the &lt;/span&gt;&amp;lt;see cref="MasterDetailViewModel&amp;amp;lt;T, V&amp;amp;gt;"/&amp;gt;&lt;span style="color: green;"&gt; class.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;/summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; MasterDetailViewModel()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : &lt;span style="color: blue;"&gt;base&lt;/span&gt;()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Details = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;IMasterDetailViewModel&lt;/span&gt;&amp;gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OnMasterChanged = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Action&lt;/span&gt;(MasterChanged);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; Initializes a new instance of the &lt;/span&gt;&amp;lt;see cref="MasterDetailViewModel&amp;amp;lt;T, V&amp;amp;gt;"/&amp;gt;&lt;span style="color: green;"&gt; class.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;/summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;param name="master"&amp;gt;&lt;span style="color: green;"&gt;The master collection&lt;/span&gt;&amp;lt;/param&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;param name="path"&amp;gt;&lt;span style="color: green;"&gt;The path.&lt;/span&gt;&amp;lt;/param&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; MasterDetailViewModel(&lt;span style="color: #2b91af;"&gt;IMasterDetailViewModel&lt;/span&gt; master, &lt;span style="color: blue;"&gt;string&lt;/span&gt; path)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : &lt;span style="color: blue;"&gt;this&lt;/span&gt;()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Binding&lt;/span&gt; b = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Binding&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b.Source = master.ViewSource;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b.Path = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PropertyPath&lt;/span&gt;(path);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;BindingOperations&lt;/span&gt;.SetBinding(ViewSource, &lt;span style="color: #2b91af;"&gt;CollectionViewSource&lt;/span&gt;.SourceProperty, b);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; master.Details.Add(&lt;span style="color: blue;"&gt;this&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewSourceChanged();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; Adds new handlers to the new View's CurrentChanged event and calls View_CurrentChanged.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;/summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ViewSourceChanged()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (View == &lt;span style="color: blue;"&gt;null&lt;/span&gt;) &lt;span style="color: blue;"&gt;return&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IView.CurrentChanged -= &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;EventHandler&lt;/span&gt;(View_CurrentChanged);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IView.CurrentChanged += &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;EventHandler&lt;/span&gt;(View_CurrentChanged);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; View_CurrentChanged(&lt;span style="color: blue;"&gt;null&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt;.Empty);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;/div&gt;
You can’t just set a DataSource and a DataMember like with the BindingSource in windows forms. Instead you have to call this strange looking BindingOperations.SetBinding method to set the _viewSource field of type CollectionViewSource. 
    &lt;br /&gt;The details viewmodel is added to the master viewmodel with this method:&lt;br /&gt;
&lt;br /&gt;master.Details.Add(&lt;span style="color: blue;"&gt;this&lt;/span&gt;);&lt;br /&gt;
&lt;br /&gt;The AddEventCallCurrentChanged method is called every time the view changes. If there’s an event handler it will be removed because you don’t want to keep adding multiple event handlers to each view. Every time the view changes position the View_CurrentChanged method is called: &lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; Handles the CurrentChanged event of the View control.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;/summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;param name="sender"&amp;gt;&lt;span style="color: green;"&gt;The source of the event.&lt;/span&gt;&amp;lt;/param&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;param name="e"&amp;gt;&lt;span style="color: green;"&gt;The &lt;/span&gt;&amp;lt;see cref="System.EventArgs"/&amp;gt;&lt;span style="color: green;"&gt; instance containing the event data.&lt;/span&gt;&amp;lt;/param&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; View_CurrentChanged(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;base&lt;/span&gt;.View_CurrentChanged(sender, e);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;IMasterDetailViewModel&lt;/span&gt; detail &lt;span style="color: blue;"&gt;in&lt;/span&gt; Details)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._currentDispatcher.BeginInvoke(detail.OnMasterChanged, &lt;span style="color: #2b91af;"&gt;DispatcherPriority&lt;/span&gt;.Render);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
If the viewmodel is a master table with detail tables the OnMasterChanged action is called for each detail table. This action again calls the MasterChanged method that updates the handlers of the CurrentChanged event of the View. The MasterChanged method needs to be called with an BeginInvoke because otherwise the details of the old View property are shown instead of the current view. 
    &lt;br /&gt;The View_CurrentChanged method that is called in the CollectionViewModel base class looks like this: 

    &lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; Handles the CurrentChanged event of the IView control.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;/summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;param name="sender"&amp;gt;&lt;span style="color: green;"&gt;The source of the event.&lt;/span&gt;&amp;lt;/param&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;param name="e"&amp;gt;&lt;span style="color: green;"&gt;The &lt;/span&gt;&amp;lt;see cref="System.EventArgs"/&amp;gt;&lt;span style="color: green;"&gt; instance containing the event data.&lt;/span&gt;&amp;lt;/param&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; View_CurrentChanged(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (IView == &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RaisePropertyChanged(() =&amp;gt; Position);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CurrentViewModel.Item = CurrentItem;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RaisePropertyChanged(() =&amp;gt; CurrentItem);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RaisePropertyChanged(() =&amp;gt; CurrentViewModel);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;CurrentChangedArgs&lt;/span&gt;&amp;lt;T, V&amp;gt;&amp;gt; temp = CurrentChanged;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (temp != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp(&lt;span style="color: blue;"&gt;null&lt;/span&gt;, &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CurrentChangedArgs&lt;/span&gt;&amp;lt;T, V&amp;gt;(CurrentItem, CurrentViewModel));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;/div&gt;
In this method the CurrentItem of the CurrentViewModel are set, and all changed properties will notify the view that they have changed. 
    &lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; Called by the master viewmodel. Adds new handlers to the View's CurrentChanged event and&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; Notifies the Count and View properties have changed.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;span style="color: green;"&gt; &lt;/span&gt;&amp;lt;/summary&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; MasterChanged()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AddEventCallCurrentChanged();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RaisePropertyChanged(() =&amp;gt; Count);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RaisePropertyChanged(() =&amp;gt; View);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;/div&gt;
The Add method and the CanAdd property implementation are shown below: &lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Adds an item to the collection.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Add()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; T item = (T)View.AddNew();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; View.CommitNew();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RaisePropertyChanged(() =&amp;gt; Count);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Gets a value indicating whether this instance can add an item.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;c&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;true&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/c&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt; if this instance can add an item; otherwise, &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;c&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;false&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/c&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; CanAdd&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; View != &lt;span style="color: blue;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; View.CanAddNew;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;/div&gt;
The AddNew method of the View is called in the Add method. This creates a new item. If you want to change the item after its creation, you can add an handler to the ItemAddedEvent. The rest of the class overrides all the other abstract methods and properties of the NavigationViewModel. &lt;br /&gt;
&lt;h3&gt;
Implementation&lt;/h3&gt;
The database has a Customer, Order and an OrderDetails table. For each table a viewmodel must be created. You can also define a viewmodel for the currently selected items in the table. Below the viewmodel for an order is defined. &lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Viewmodel of an Order item. Just to show the use of the IItemViewModel interface this one&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; has the WorkSpaceViewModel as its base class. &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OrderWorkspaceViewModel&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;WorkspaceViewModel&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;IItemViewModel&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Order&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region&lt;/span&gt; IItemViewModel&amp;lt;Order&amp;gt; Members&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Order&lt;/span&gt; Item&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
The OrderWorkSpaceViewModel has the WorkSpaceViewModel of Josh Smith as its base class. This definition has no use in the example application but it shows how you can derive from another viewmodel and still add the needed behaviour of the IItemViewModel interface. The viewmodel for the orders table now looks like this:&amp;nbsp; &lt;br /&gt;
&lt;div style="background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OrdersViewModel&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;MasterDetailViewModel&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Order&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;OrderWorkspaceViewModel&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; OrdersViewModel(&lt;span style="color: #2b91af;"&gt;CustomersViewModel&lt;/span&gt; vm)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(vm, &lt;span style="color: #a31515;"&gt;"Orders"&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;/div&gt;
The master table is the customers table. The Orders table becomes the detail table. 
    &lt;br /&gt;In Xaml all you have to do to add a navigation control and a table view to a grid is type the following two lines: &lt;br /&gt;
&lt;div style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: white; color: black; font-family: courier new; font-size: 10pt;"&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;        &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;vw&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: #a31515;"&gt;NavigationControl&lt;/span&gt;&lt;span style="color: red;"&gt; DataContext&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;=Orders}"&lt;/span&gt;&lt;span style="color: red;"&gt; Grid.Row&lt;/span&gt;&lt;span style="color: blue;"&gt;="2" /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;        &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;my&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: #a31515;"&gt;DataGrid&lt;/span&gt;&lt;span style="color: red;"&gt; Grid.Row&lt;/span&gt;&lt;span style="color: blue;"&gt;="3"&lt;/span&gt;&lt;span style="color: red;"&gt; ItemsSource&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Orders&lt;/span&gt;&lt;span style="color: blue;"&gt;.&lt;/span&gt;&lt;span style="color: red;"&gt;View&lt;/span&gt;&lt;span style="color: blue;"&gt;}"/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
The DataContext of the navigation control is bound to the orders viewmodel. The ItemsSource of the DataGrid is bound to View property of type BindingListCollectionView of the orders viewmodel. The creation of a view for the other tables is not very different. You can view all details in the source code. 

  &lt;br /&gt;

  &lt;br /&gt;
&lt;h3&gt;
Conclusion/Remarks&lt;/h3&gt;
&lt;/span&gt;&lt;span class="fullpost"&gt;I think having a master/detail viewmodel reduces the amount of code you have to type considerably. It also reduces the complexity for the end user. 

  &lt;br /&gt;The navigation control and viewmodel work good but can have some added functionality. 

  &lt;br /&gt;Also I would like to add some custom sorting, filtering, and grouping. The View property of CollectionViewSource has functionality for filtering but it doesn’t work in the sample application. 

  &lt;br /&gt;So if you have any comments or know how to improve the code please contact me. You can find the source code &lt;a href="http://sites.google.com/site/projectsincsharp/Home/my-files/CollectionMVVM.zip?attredirects=0"&gt;here&lt;/a&gt;. 

  &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7109267400150843396-436398532610339741?l=reyntjes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reyntjes.blogspot.com/feeds/436398532610339741/comments/default' title='Reacties plaatsen'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7109267400150843396&amp;postID=436398532610339741' title='1 reacties'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7109267400150843396/posts/default/436398532610339741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7109267400150843396/posts/default/436398532610339741'/><link rel='alternate' type='text/html' href='http://reyntjes.blogspot.com/2009/04/master-detail-viewmodel_24.html' title='A Master-Detail ViewModel'/><author><name>Robert</name><uri>http://www.blogger.com/profile/05660555650840919887</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_GFw1SxNbrEs/SiQ_NUzyQAI/AAAAAAAABsE/ILw0o_q1AZ0/s72-c/image12_thumb.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7109267400150843396.post-1995382152329291493</id><published>2008-12-03T12:39:00.000-08:00</published><updated>2009-04-10T05:39:41.842-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='viewmodel'/><category scheme='http://www.blogger.com/atom/ns#' term='wpf'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>My version of Jason Dollinger's demonstration code</title><content type='html'>I saw &lt;a href="http://blog.lab49.com/archives/2650"&gt;this post&lt;/a&gt;. It refers to a video where Jason Dollinger creates a small program with the help of a pattern called model-view-viewmodel (m-v-vm). Some people wrote in the comments to this post that they wanted the source code of the program that was created in this video. I thought it would be nice to recreate the program as a way of learning about this pattern. After I wrote it I thought it would be nice to share it with you.
I haven't implemented the unity framework yet. But I already have used the &lt;a href="http://www.codeplex.com/MEF"&gt;MEF library&lt;/a&gt; in other programs. So I probably will write an update of this program in the future where the MEF framework is used.
Because I wrote the program in Visual Studio Express no unit testing is included.
You can download the file &lt;a href="http://sites.google.com/site/projectsincsharp/Home/my-files/MVVM.Demo.Client.zip?attredirects=0"&gt;here&lt;/a&gt;.
If you have any comments or suggestions please let me know!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7109267400150843396-1995382152329291493?l=reyntjes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reyntjes.blogspot.com/feeds/1995382152329291493/comments/default' title='Reacties plaatsen'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7109267400150843396&amp;postID=1995382152329291493' title='8 reacties'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7109267400150843396/posts/default/1995382152329291493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7109267400150843396/posts/default/1995382152329291493'/><link rel='alternate' type='text/html' href='http://reyntjes.blogspot.com/2008/12/my-version-of-jason-dollingers.html' title='My version of Jason Dollinger&apos;s demonstration code'/><author><name>Robert</name><uri>http://www.blogger.com/profile/05660555650840919887</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7109267400150843396.post-4937149392432902311</id><published>2008-12-01T08:27:00.000-08:00</published><updated>2010-06-02T12:21:25.128-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='viewmodel'/><category scheme='http://www.blogger.com/atom/ns#' term='master'/><category scheme='http://www.blogger.com/atom/ns#' term='wpf'/><category scheme='http://www.blogger.com/atom/ns#' term='detail'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Creating a master/detail viewmodel</title><content type='html'>&lt;div&gt;
&lt;b&gt;UPDATE 4-6-2009:&lt;/b&gt; An article about the latest version of this program can be found &lt;a href="http://reyntjes.blogspot.com/2009/04/master-detail-viewmodel_24.html"&gt;here&lt;/a&gt;. The viewmodel described in this article has changed a lot.&lt;/div&gt;
&lt;h2&gt;
&lt;span style="font-family: Georgia;"&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;span style="font-family: Georgia;"&gt;&lt;/span&gt;  &lt;span style="font-family: Georgia;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Georgia;"&gt;&lt;div class="post-body entry-content"&gt;
&lt;span style="font-family: 'Courier New';"&gt;I&lt;/span&gt;'m just starting with wpf and I read Beth Massi's &lt;a href="http://windowsclient.net/learn/video.aspx?v=82524"&gt;&lt;span style="color: black; text-decoration: none;"&gt;code&lt;/span&gt;&lt;/a&gt; that belonged to &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=wpfdatavideos&amp;amp;DownloadId=3528"&gt;&lt;span style="color: black; text-decoration: none;"&gt;this video&lt;/span&gt;&lt;/a&gt;. It's about creating a master/detail view in wpf. I also saw Jason Dollingers's video about creating a viewmodel: &lt;a href="http://blog.lab49.com/archives/2650"&gt;&lt;span style="color: black; text-decoration: none;"&gt;Jason Dolinger on Model-View-ViewModel&lt;/span&gt;&lt;/a&gt;  I though I could give this viewmodel thing a try using as a starting point Beth Massi's code.   &lt;span class="fullpost"&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;&lt;h3&gt;
&lt;a name='more'&gt;&lt;/a&gt;The Master ViewModel &lt;/h3&gt;
First I created a generic class called CollectionModelView:  &lt;br /&gt;
&lt;div style="background-color: white; color: black; font-family: 'Courier New';"&gt;
&lt;div style="background-color: white; color: black; font-family: 'Courier New';"&gt;
&lt;pre style="margin-left: 0px; margin-right: 0px;"&gt;&lt;br /&gt;
&lt;div style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: white none repeat scroll 0% 0%; color: black; font-family: Courier New;"&gt;
&lt;pre style="margin: 0px;"&gt;&lt;br /&gt;
&lt;div style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: white none repeat scroll 0% 0%; color: black; font-family: Courier New;"&gt;
&lt;div style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: white none repeat scroll 0% 0%; color: black; font-family: Courier New;"&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CollectionViewModel&lt;/span&gt;&amp;lt;T&amp;gt; : &lt;span style="color: #2b91af;"&gt;DependencyObject&lt;/span&gt; &lt;span style="color: green;"&gt;//,ICollectionViewModel&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; data;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CollectionViewSource&lt;/span&gt; masterViewSource = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CollectionViewSource&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; CollectionViewModel(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; list):&lt;span style="color: blue;"&gt;this&lt;/span&gt;()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;Data = list;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; CollectionViewModel()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;AddCommand = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CommandAdd&lt;/span&gt;(&lt;span style="color: blue;"&gt;this&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;DeleteCommand = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CommandDelete&lt;/span&gt;(&lt;span style="color: blue;"&gt;this&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;PreviousCommand = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CommandPrevious&lt;/span&gt;(&lt;span style="color: blue;"&gt;this&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;NextCommand = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CommandNext&lt;/span&gt;(&lt;span style="color: blue;"&gt;this&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; Data { &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; data; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;data = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;masterViewSource.Source = data;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;MasterView = (&lt;span style="color: #2b91af;"&gt;BindingListCollectionView&lt;/span&gt;)masterViewSource.View;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;BindingListCollectionView&lt;/span&gt; MasterView&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;BindingListCollectionView&lt;/span&gt;)GetValue(MasterViewProperty); }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;set&lt;/span&gt; { SetValue(MasterViewProperty, &lt;span style="color: blue;"&gt;value&lt;/span&gt;); }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;// Using a DependencyProperty as the backing store for MasterView.  This enables animation, styling, binding, etc...&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&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;readonly&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DependencyProperty&lt;/span&gt; MasterViewProperty =&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;DependencyProperty&lt;/span&gt;.Register(&lt;span style="color: #a31515;"&gt;"MasterView"&lt;/span&gt;, &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;BindingListCollectionView&lt;/span&gt;), &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;CollectionViewModel&lt;/span&gt;&amp;lt;T&amp;gt;), &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;UIPropertyMetadata&lt;/span&gt;(&lt;span style="color: blue;"&gt;null&lt;/span&gt;));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CollectionViewSource&lt;/span&gt; MasterViewSource { &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; masterViewSource; } }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; T CurrentItem&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;get&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt; (T)GetValue(CurrentItemProperty);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;SetValue(CurrentItemProperty, &lt;span style="color: blue;"&gt;value&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;// Using a DependencyProperty as the backing store for CurrentItem.  This enables animation, styling, binding, etc...&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&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;readonly&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DependencyProperty&lt;/span&gt; CurrentItemProperty =&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;DependencyProperty&lt;/span&gt;.Register(&lt;span style="color: #a31515;"&gt;"CurrentItem"&lt;/span&gt;, &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(T), &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;CollectionViewModel&lt;/span&gt;&amp;lt;T&amp;gt;), &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;UIPropertyMetadata&lt;/span&gt;(&lt;span style="color: blue;"&gt;null&lt;/span&gt;, &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PropertyChangedCallback&lt;/span&gt;(OnCurrentItemChanged)));&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&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; OnCurrentItemChanged(&lt;span style="color: #2b91af;"&gt;DependencyObject&lt;/span&gt; d, &lt;span style="color: #2b91af;"&gt;DependencyPropertyChangedEventArgs&lt;/span&gt; e)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;/*CollectionViewModel&amp;lt;T&amp;gt; mv = (CollectionViewModel&amp;lt;T&amp;gt;)d;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;            if (mv.CurrentViewModel != null)&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;                mv.CurrentViewModel.Item = (T)e.NewValue;*/&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;//public ItemViewModel&amp;lt;T&amp;gt; CurrentViewModel { get; set; }&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ICommand&lt;/span&gt; AddCommand { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;set&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ICommand&lt;/span&gt; DeleteCommand { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;set&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ICommand&lt;/span&gt; PreviousCommand { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;set&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ICommand&lt;/span&gt; NextCommand { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;set&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: grey;"&gt;//&lt;/span&gt;&lt;span style="color: green;"&gt; Not all commands are shown because they are pretty simple&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;br /&gt;
&lt;div style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: white none repeat scroll 0% 0%; color: black; font-family: Courier New;"&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;br /&gt;
&lt;div style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: white none repeat scroll 0% 0%; color: black; font-family: Courier New;"&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: grey;"&gt;///&lt;/span&gt; &lt;span style="color: grey;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Private implementation of the Add Command&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: grey;"&gt;///&lt;/span&gt; &lt;span style="color: grey;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CommandAdd&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;MasterBaseCommand&lt;/span&gt;&amp;lt;T&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; CommandAdd(&lt;span style="color: #2b91af;"&gt;CollectionViewModel&lt;/span&gt;&amp;lt;T&amp;gt; viewmodel): &lt;span style="color: blue;"&gt;base&lt;/span&gt;(viewmodel) { }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;            #region&lt;/span&gt; ICommand Members&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&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;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;_vm.MasterView.AddNew();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;_vm.MasterView.CommitNew();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;            #endregion&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: grey;"&gt;///&lt;/span&gt; &lt;span style="color: grey;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: grey;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Private implementation of the Delete Command&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: grey;"&gt;///&lt;/span&gt; &lt;span style="color: grey;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CommandPrevious&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;MasterBaseCommand&lt;/span&gt;&amp;lt;T&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; CommandPrevious(&lt;span style="color: #2b91af;"&gt;CollectionViewModel&lt;/span&gt;&amp;lt;T&amp;gt; viewmodel) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(viewmodel) { }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;            #region&lt;/span&gt; ICommand Members&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&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;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt; _vm.MasterView.CurrentPosition &amp;gt; 0;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&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;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;_vm.MasterView.MoveCurrentToPrevious();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;            #endregion&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}
&lt;/pre&gt;
&lt;/div&gt;
&lt;pre style="font-family: Georgia; margin: 0px;"&gt;&lt;/pre&gt;
&lt;span style="font-family: Georgia;"&gt;The generic base class for all commands looks like this:&lt;/span&gt;

&lt;br /&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="font-family: 'Courier New';"&gt;
&lt;br /&gt;
&lt;div style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: white none repeat scroll 0% 0%; color: black; font-family: Courier New;"&gt;
&lt;pre style="margin: 0px;"&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;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MasterBaseCommand&lt;/span&gt;&amp;lt;T&amp;gt; : &lt;span style="color: #2b91af;"&gt;ICommand&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CollectionViewModel&lt;/span&gt;&amp;lt;T&amp;gt; _vm;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; MasterBaseCommand(&lt;span style="color: #2b91af;"&gt;CollectionViewModel&lt;/span&gt;&amp;lt;T&amp;gt; viewModel)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;_vm = viewModel;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;        #region&lt;/span&gt; ICommand Members&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;virtual&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;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&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;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;add&lt;/span&gt; { &lt;span style="color: #2b91af;"&gt;CommandManager&lt;/span&gt;.RequerySuggested += &lt;span style="color: blue;"&gt;value&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;remove&lt;/span&gt; { &lt;span style="color: #2b91af;"&gt;CommandManager&lt;/span&gt;.RequerySuggested -= &lt;span style="color: blue;"&gt;value&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&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;void&lt;/span&gt; Execute(&lt;span style="color: blue;"&gt;object&lt;/span&gt; parameter);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;        #endregion&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div style="background-color: white; color: black; font-family: 'Courier New';"&gt;
&lt;pre style="font-family: Georgia; margin-left: 0px; margin-right: 0px;"&gt;Now you already can create your own master/detail viewmodel:&lt;/pre&gt;
&lt;pre style="margin-left: 0px; margin-right: 0px;"&gt;&lt;br /&gt;
&lt;div color="black" face="Courier New" style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: white none repeat scroll 0% 0%;"&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OrdersViewModel&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;CollectionViewModel&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Order&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; OrdersViewModel(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Order&lt;/span&gt;&amp;gt; orders) :&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;base&lt;/span&gt;(orders) { }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="font-family: Georgia; margin: 0px;"&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;div style="font-family: Georgia;"&gt;
Create a OrdersViewModel and assigning it to the DataContext of the window. Here's an example how you can create master/detail&lt;/div&gt;
&lt;span style="font-family: Georgia;"&gt;tables in xaml now:&lt;/span&gt;  &lt;br /&gt;
&lt;pre style="margin-left: 0px; margin-right: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin-left: 0px; margin-right: 0px;"&gt;&lt;span style="font-family: Georgia;"&gt;
&lt;br /&gt;
&lt;pre style="margin-left: 0px; margin-right: 0px;"&gt;&lt;span style="color: #a31515;"&gt;        &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;my&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: #a31515;"&gt;DataGrid&lt;/span&gt;&lt;span style="color: red;"&gt; Name&lt;/span&gt;&lt;span style="color: blue;"&gt;="dataGrid1"&lt;/span&gt;&lt;span style="color: red;"&gt; ItemsSource&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; MasterView&lt;/span&gt;&lt;span style="color: blue;"&gt;}"&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="margin-left: 0px; margin-right: 0px;"&gt;&lt;span style="color: red;"&gt; SelectedValue&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;=CurrentItem,&lt;/span&gt;&lt;span style="color: red;"&gt; Mode&lt;/span&gt;&lt;span style="color: blue;"&gt;=OneWayToSource}"&lt;/span&gt;&lt;span style="color: red;"&gt; IsSynchronizedWithCurrentItem&lt;/span&gt;&lt;span style="color: blue;"&gt;="True"&lt;/span&gt;&lt;span style="color: red;"&gt; Grid.Row&lt;/span&gt;&lt;span style="color: blue;"&gt;="1" /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin-left: 0px; margin-right: 0px;"&gt;&lt;span style="color: #a31515;"&gt;        &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;my&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: #a31515;"&gt;DataGrid&lt;/span&gt;&lt;span style="color: red;"&gt; Grid.Row&lt;/span&gt;&lt;span style="color: blue;"&gt;="2"&lt;/span&gt;&lt;span style="color: red;"&gt; Height&lt;/span&gt;&lt;span style="color: blue;"&gt;="Auto"&lt;/span&gt;&lt;span style="color: red;"&gt; Margin&lt;/span&gt;&lt;span style="color: blue;"&gt;="0"&lt;/span&gt;&lt;span style="color: red;"&gt; Name&lt;/span&gt;&lt;span style="color: blue;"&gt;="dataGrid2"&lt;/span&gt;&lt;span style="color: red;"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="color: blue;"&gt;="Stretch"&lt;/span&gt;
&lt;/pre&gt;
&lt;pre style="margin-left: 0px; margin-right: 0px;"&gt;&lt;span style="color: red;"&gt; ItemsSource&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; CurrentItem&lt;/span&gt;&lt;span style="color: blue;"&gt;.&lt;/span&gt;&lt;span style="color: red;"&gt;OrderDetails&lt;/span&gt;&lt;span style="color: blue;"&gt;}"/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;div style="font-family: Georgia;"&gt;
In this piece of xaml code the SelectedValue property of the datagrid binds to the CurrentItem property of the viewmodel. &lt;/div&gt;
&lt;div style="font-family: Georgia;"&gt;
The second datagrid binds to the OrderDetails. &lt;/div&gt;
&lt;div style="font-family: Georgia;"&gt;
&lt;/div&gt;
&lt;h3 style="font-family: Georgia; margin-left: 0px; margin-right: 0px;"&gt;
&lt;b&gt;The Details ViewModel&lt;/b&gt; &lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;span style="font-family: Georgia;"&gt;By deriving from the generic  CollectionVewModel class we can create a DetailViewModel class.&lt;/span&gt;  &lt;br /&gt;
&lt;div class="post-body entry-content"&gt;
&lt;/div&gt;
&lt;div class="post-body entry-content"&gt;
&lt;div class="post-body entry-content"&gt;
&lt;div color="black" face="Courier New" style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: white none repeat scroll 0% 0%;"&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DetailViewModel&lt;/span&gt;&amp;lt;V&amp;gt; : &lt;span style="color: #2b91af;"&gt;CollectionViewModel&lt;/span&gt;&amp;lt;V&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; path;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; DetailViewModel(&lt;span style="color: #2b91af;"&gt;CollectionViewSource&lt;/span&gt; master, &lt;span style="color: blue;"&gt;string&lt;/span&gt; path)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;: &lt;span style="color: blue;"&gt;base&lt;/span&gt;()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;.path = path;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;Binding&lt;/span&gt; b = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Binding&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;b.Source = master;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;b.Path = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PropertyPath&lt;/span&gt;(path);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;BindingOperations&lt;/span&gt;.SetBinding(masterViewSource, &lt;span style="color: #2b91af;"&gt;CollectionViewSource&lt;/span&gt;.SourceProperty, b);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;MasterView = (&lt;span style="color: #2b91af;"&gt;BindingListCollectionView&lt;/span&gt;)masterViewSource.View;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;master.View.CurrentChanged += &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;EventHandler&lt;/span&gt;(View_CurrentChanged);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; Path&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; path; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;void&lt;/span&gt; View_CurrentChanged(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;MasterView = (&lt;span style="color: #2b91af;"&gt;BindingListCollectionView&lt;/span&gt;)masterViewSource.View;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="post-body entry-content" style="font-family: Georgia;"&gt;
&lt;/div&gt;
&lt;div class="post-body entry-content"&gt;
&lt;div style="font-family: Georgia;"&gt;
The DetailViewModel is like the CollectionViewModel except that a child table name should be assigned in the constructor. &lt;/div&gt;
&lt;span style="font-family: Verdana;"&gt;&lt;/span&gt;  &lt;span style="font-family: Verdana;"&gt;&lt;span style="font-family: Georgia;"&gt;We can now create an OrdersViewModel and an OrderDetailsViewmodel like below:&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div class="post-body entry-content"&gt;
&lt;span style="font-family: -webkit-monospace;"&gt;    &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OrdersViewModel&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;CollectionViewModel&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Order&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: white none repeat scroll 0% 0%; color: black; font-family: Courier New;"&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; OrdersViewModel(&lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Order&lt;/span&gt;&amp;gt; orders) :&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;base&lt;/span&gt;(orders) { }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OrderDetailsViewModel&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;DetailViewModel&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;OrdersViewModel&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; OrderDetailsViewModel(&lt;span style="color: #2b91af;"&gt;OrdersViewModel&lt;/span&gt; vm)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;: &lt;span style="color: blue;"&gt;base&lt;/span&gt;(vm.MasterViewSource, &lt;span style="color: #a31515;"&gt;"OrderDetails"&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DataModule&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OMSDataContext&lt;/span&gt; db = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OMSDataContext&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OrdersViewModel&lt;/span&gt; Orders { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;set&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OrderDetailsViewModel&lt;/span&gt; OrderDetails { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;set&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; ViewModels()&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;Orders = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OrdersViewModel&lt;/span&gt;(db.Orders);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;OrderDetails = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;OrderDetailsViewModel&lt;/span&gt;(Orders);&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}
&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;span style="font-family: Georgia; font-size: 85%;"&gt;&lt;/span&gt;  &lt;span style="font-family: Georgia; font-size: 85%;"&gt;All you have to do now is create a DataModule and connect it to the DataContext of the main window: &lt;/span&gt;&lt;/div&gt;
&lt;div color="black" face="Courier New" style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: white none repeat scroll 0% 0%;"&gt;
&lt;/div&gt;
&lt;div style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: white none repeat scroll 0% 0%; color: black; font-family: Courier New;"&gt;
&lt;span style="font-size: 85%;"&gt;&lt;/span&gt;  &lt;span style="font-size: 85%;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: 85%;"&gt;&lt;div style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: white none repeat scroll 0% 0%; color: black; font-family: Courier New;"&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;this&lt;/span&gt;.DataContext = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DataModule&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;div style="font-family: Georgia;"&gt;
The xaml code for the main window now looks like this: &lt;/div&gt;
&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;br /&gt;
&lt;div color="black" face="Courier New" style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: white none repeat scroll 0% 0%;"&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Window&lt;/span&gt;&lt;span style="color: red;"&gt; x&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;Class&lt;/span&gt;&lt;span style="color: blue;"&gt;="MasterDetailViewModel.MasterDetailWindow2"&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: red;"&gt; xmlns&lt;/span&gt;&lt;span style="color: blue;"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: red;"&gt; xmlns&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;x&lt;/span&gt;&lt;span style="color: blue;"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: red;"&gt; Title&lt;/span&gt;&lt;span style="color: blue;"&gt;="Window1"&lt;/span&gt;&lt;span style="color: red;"&gt; Height&lt;/span&gt;&lt;span style="color: blue;"&gt;="302"&lt;/span&gt;&lt;span style="color: red;"&gt; Width&lt;/span&gt;&lt;span style="color: blue;"&gt;="430"&lt;/span&gt;&lt;span style="color: red;"&gt; Loaded&lt;/span&gt;&lt;span style="color: blue;"&gt;="Window_Loaded"&lt;/span&gt;&lt;span style="color: red;"&gt; xmlns&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;my&lt;/span&gt;&lt;span style="color: blue;"&gt;="http://schemas.microsoft.com/wpf/2008/toolkit"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;    &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Grid&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;        &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;            &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;RowDefinition&lt;/span&gt;&lt;span style="color: red;"&gt; Height&lt;/span&gt;&lt;span style="color: blue;"&gt;="36" /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;            &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;RowDefinition&lt;/span&gt;&lt;span style="color: red;"&gt; Height&lt;/span&gt;&lt;span style="color: blue;"&gt;="131*" /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;            &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;RowDefinition&lt;/span&gt;&lt;span style="color: red;"&gt; Height&lt;/span&gt;&lt;span style="color: blue;"&gt;="95*" /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;        &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;        &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color: red;"&gt; Name&lt;/span&gt;&lt;span style="color: blue;"&gt;="StackPanel3"&lt;/span&gt;&lt;span style="color: red;"&gt; Orientation&lt;/span&gt;&lt;span style="color: blue;"&gt;="Horizontal"&lt;/span&gt;&lt;span style="color: red;"&gt; Grid.Row&lt;/span&gt;&lt;span style="color: blue;"&gt;="0"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;            &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Button&lt;/span&gt;&lt;span style="color: red;"&gt; Height&lt;/span&gt;&lt;span style="color: blue;"&gt;="25"&lt;/span&gt;&lt;span style="color: red;"&gt; Name&lt;/span&gt;&lt;span style="color: blue;"&gt;="btnAdd"&lt;/span&gt;&lt;span style="color: red;"&gt; Width&lt;/span&gt;&lt;span style="color: blue;"&gt;="Auto"&lt;/span&gt;&lt;span style="color: red;"&gt; Margin&lt;/span&gt;&lt;span style="color: blue;"&gt;="3"&lt;/span&gt;&lt;span style="color: red;"&gt; Command&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Orders&lt;/span&gt;&lt;span style="color: blue;"&gt;.&lt;/span&gt;&lt;span style="color: red;"&gt;AddCommand&lt;/span&gt;&lt;span style="color: blue;"&gt;}"&amp;gt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Add Order&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Button&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;            &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Button&lt;/span&gt;&lt;span style="color: red;"&gt; Height&lt;/span&gt;&lt;span style="color: blue;"&gt;="25"&lt;/span&gt;&lt;span style="color: red;"&gt; Name&lt;/span&gt;&lt;span style="color: blue;"&gt;="btnDelete"&lt;/span&gt;&lt;span style="color: red;"&gt; Width&lt;/span&gt;&lt;span style="color: blue;"&gt;="Auto"&lt;/span&gt;&lt;span style="color: red;"&gt; Margin&lt;/span&gt;&lt;span style="color: blue;"&gt;="3"&lt;/span&gt;&lt;span style="color: red;"&gt; Command&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Orders&lt;/span&gt;&lt;span style="color: blue;"&gt;.&lt;/span&gt;&lt;span style="color: red;"&gt;DeleteCommand&lt;/span&gt;&lt;span style="color: blue;"&gt;}"&amp;gt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Delete Order&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Button&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;            &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Button&lt;/span&gt;&lt;span style="color: red;"&gt; Height&lt;/span&gt;&lt;span style="color: blue;"&gt;="25"&lt;/span&gt;&lt;span style="color: red;"&gt; Name&lt;/span&gt;&lt;span style="color: blue;"&gt;="btnPrevious"&lt;/span&gt;&lt;span style="color: red;"&gt; Width&lt;/span&gt;&lt;span style="color: blue;"&gt;="75"&lt;/span&gt;&lt;span style="color: red;"&gt; Margin&lt;/span&gt;&lt;span style="color: blue;"&gt;="3"&lt;/span&gt;&lt;span style="color: red;"&gt; Command&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Orders&lt;/span&gt;&lt;span style="color: blue;"&gt;.&lt;/span&gt;&lt;span style="color: red;"&gt;PreviousCommand&lt;/span&gt;&lt;span style="color: blue;"&gt;}"&amp;gt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Previous&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Button&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;            &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Button&lt;/span&gt;&lt;span style="color: red;"&gt; Height&lt;/span&gt;&lt;span style="color: blue;"&gt;="25"&lt;/span&gt;&lt;span style="color: red;"&gt; Name&lt;/span&gt;&lt;span style="color: blue;"&gt;="btnNext"&lt;/span&gt;&lt;span style="color: red;"&gt; Width&lt;/span&gt;&lt;span style="color: blue;"&gt;="75"&lt;/span&gt;&lt;span style="color: red;"&gt; Margin&lt;/span&gt;&lt;span style="color: blue;"&gt;="3"&lt;/span&gt;&lt;span style="color: red;"&gt; Command&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Orders&lt;/span&gt;&lt;span style="color: blue;"&gt;.&lt;/span&gt;&lt;span style="color: red;"&gt;NextCommand&lt;/span&gt;&lt;span style="color: blue;"&gt;}"&amp;gt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Next&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Button&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;            &lt;/span&gt;&lt;span style="color: green;"&gt;&amp;lt;!-- The save button can work if I also allow the dataconnection in the ViewModel&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;            and add a save command&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;            &amp;lt;Button Height="25" Name="btnSave" Width="75" Margin="3" Command="{Binding SaveCommand}"&amp;gt;Save&amp;lt;/Button&amp;gt;--&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;        &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;        &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;my&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: #a31515;"&gt;DataGrid&lt;/span&gt;&lt;span style="color: red;"&gt; Name&lt;/span&gt;&lt;span style="color: blue;"&gt;="dataGrid1"&lt;/span&gt;&lt;span style="color: red;"&gt; ItemsSource&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; Orders&lt;/span&gt;&lt;span style="color: blue;"&gt;.&lt;/span&gt;&lt;span style="color: red;"&gt;MasterView&lt;/span&gt;&lt;span style="color: blue;"&gt;}"&lt;/span&gt;&lt;span style="color: red;"&gt; IsSynchronizedWithCurrentItem&lt;/span&gt;&lt;span style="color: blue;"&gt;="True"&lt;/span&gt;&lt;span style="color: red;"&gt; Grid.Row&lt;/span&gt;&lt;span style="color: blue;"&gt;="1"/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;        &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;my&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: #a31515;"&gt;DataGrid&lt;/span&gt;&lt;span style="color: red;"&gt; Grid.Row&lt;/span&gt;&lt;span style="color: blue;"&gt;="2"&lt;/span&gt;&lt;span style="color: red;"&gt; Height&lt;/span&gt;&lt;span style="color: blue;"&gt;="Auto"&lt;/span&gt;&lt;span style="color: red;"&gt; Margin&lt;/span&gt;&lt;span style="color: blue;"&gt;="0"&lt;/span&gt;&lt;span style="color: red;"&gt; Name&lt;/span&gt;&lt;span style="color: blue;"&gt;="dataGrid2"&lt;/span&gt;&lt;span style="color: red;"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="color: blue;"&gt;="Stretch"&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: red;"&gt; ItemsSource&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; OrderDetails&lt;/span&gt;&lt;span style="color: blue;"&gt;.&lt;/span&gt;&lt;span style="color: red;"&gt;MasterView&lt;/span&gt;&lt;span style="color: blue;"&gt;}"&lt;/span&gt;&lt;span style="color: red;"&gt; IsSynchronizedWithCurrentItem&lt;/span&gt;&lt;span style="color: blue;"&gt;="True"/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: #a31515;"&gt;    &lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Grid&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;Window&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;pre style="font-family: Georgia; margin: 0px;"&gt;&lt;/pre&gt;
&lt;div style="font-family: Georgia;"&gt;
That's all! Creating master/details tables is now a very easy job with the the help of the two generic classes described above! &lt;/div&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: Georgia;"&gt;Any comments are very welcome, this is my first attempt in publishing so I would love some feedback!&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7109267400150843396-4937149392432902311?l=reyntjes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reyntjes.blogspot.com/feeds/4937149392432902311/comments/default' title='Reacties plaatsen'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7109267400150843396&amp;postID=4937149392432902311' title='0 reacties'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7109267400150843396/posts/default/4937149392432902311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7109267400150843396/posts/default/4937149392432902311'/><link rel='alternate' type='text/html' href='http://reyntjes.blogspot.com/2009/04/creating-masterdetail-viewmodel.html' title='Creating a master/detail viewmodel'/><author><name>Robert</name><uri>http://www.blogger.com/profile/05660555650840919887</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
