<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Monika Dyrda</title><subtitle type="html">WPF Dev Girl</subtitle><id>http://weblogs.asp.net/monikadyrda/atom.aspx</id><link rel="alternate" type="text/html" href="http://weblogs.asp.net/monikadyrda/default.aspx" /><link rel="self" type="application/atom+xml" href="http://weblogs.asp.net/monikadyrda/atom.aspx" /><generator uri="http://communityserver.org" version="3.0.20510.895">Community Server</generator><updated>2008-12-10T19:22:00Z</updated><entry><title>Looking for a good way of sorting a ListView</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/monikadyrda/archive/2010/02/21/looking-for-a-good-way-of-sorting-a-listview.aspx" /><id>http://weblogs.asp.net/monikadyrda/archive/2010/02/21/looking-for-a-good-way-of-sorting-a-listview.aspx</id><published>2010-02-21T17:15:05Z</published><updated>2010-02-21T17:15:05Z</updated><content type="html">&lt;p&gt;For sorting data in my application I needed to call a method on a presenter which will calls a service to get data ordered by this property. Without that sorting view only would be easy but I need paging so things got complicated :-)&lt;/p&gt;  &lt;p&gt;First of all I wanted to add a name of property to sort by to each column. I simply added one property to an original GridViewColumn:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; SortableGridViewColumn : GridViewColumn
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; SortPropertyName
    {
        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt;)GetValue(SortPropertyNameProperty); }
        set { SetValue(SortPropertyNameProperty, &lt;span class="kwrd"&gt;value&lt;/span&gt;); }
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; DependencyProperty SortPropertyNameProperty =
        DependencyProperty.Register(&lt;span class="str"&gt;&amp;quot;SortPropertyName&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;string&lt;/span&gt;), 
        &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(SortableGridViewColumn), &lt;span class="kwrd"&gt;new&lt;/span&gt; UIPropertyMetadata(&lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;));
}&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Than I tried sorting in code in a control and call a method from its data context. To make it less wrong I used and interface implemented by a presenter:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; ISortingProvider
{
    &lt;span class="kwrd"&gt;void&lt;/span&gt; SortByProperty(&lt;span class="kwrd"&gt;string&lt;/span&gt; propertyName);
}&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;I simply used GridViewColumnHeader.Click:&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ListView&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;listView1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;GridViewColumnHeader&lt;/span&gt;.&lt;span class="attr"&gt;Click&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;OnColumnHeaderClicked&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ListView.View&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;GridView&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;local:SortableGridViewColumn&lt;/span&gt; &lt;span class="attr"&gt;Header&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;First Name&amp;quot;&lt;/span&gt; &lt;br /&gt;                   &lt;span class="attr"&gt;SortPropertyName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;FirstName&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
             &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;local:SortableGridViewColumn&lt;/span&gt; &lt;span class="attr"&gt;Header&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Last Name&amp;quot;&lt;/span&gt; &lt;br /&gt;&lt;span class="attr"&gt;                    SortPropertyName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;LastName&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;GridView&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ListView.View&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ListView&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;In code behind a method from presenter is called:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnColumnHeaderClicked(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)
{
    var headerClicked = e.OriginalSource &lt;span class="kwrd"&gt;as&lt;/span&gt; GridViewColumnHeader;
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (headerClicked != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
    {
        var sortableGridViewColumn = (headerClicked.Column) &lt;br /&gt;                                     &lt;span class="kwrd"&gt;as&lt;/span&gt; SortableGridViewColumn;
        Sort(sortableGridViewColumn);
    }
}

&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Sort(SortableGridViewColumn sortableGridViewColumn)
{
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (listView1.DataContext &lt;span class="kwrd"&gt;is&lt;/span&gt; ISortingProvider 
        &amp;amp;&amp;amp; sortableGridViewColumn != &lt;span class="kwrd"&gt;null&lt;/span&gt; 
        &amp;amp;&amp;amp; !String.IsNullOrEmpty(sortableGridViewColumn.SortPropertyName))
    {
       ((ISortingProvider)listView1.DataContext)
                    .SortByProperty(sortableGridViewColumn.SortPropertyName);
    }
}&lt;/pre&gt;

&lt;p&gt;This is a very simple way of achieving my goal but I don’t like it much since the view is too much aware of the presenter here. So I’ve decided to try another way – create a template which will call the presenter method using &lt;a href="http://caliburn.codeplex.com/"&gt;Caliburn&lt;/a&gt; actions.&lt;/p&gt;

&lt;p&gt;Template – on clicking on header a method is called with a parameter – column header:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;GridView.ColumnHeaderContainerStyle&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Style&lt;/span&gt; &lt;span class="attr"&gt;TargetType&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;GridViewColumnHeader&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Setter&lt;/span&gt; &lt;span class="attr"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Template&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Setter.Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ControlTemplate&lt;/span&gt; &lt;span class="attr"&gt;TargetType&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{x:Type GridViewColumnHeader}&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Border&lt;/span&gt; &lt;span class="attr"&gt;cal:Message&lt;/span&gt;.&lt;span class="attr"&gt;Attach&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;[Event MouseLeftButtonDown] &lt;br /&gt;                            = [Action Sort($source.TemplatedParent)]&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ContentPresenter&lt;/span&gt; &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;2,2,2,2&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
                     &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Border&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
                 &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ControlTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
             &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Setter.Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Setter&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
       &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Style&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;GridView.ColumnHeaderContainerStyle&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Now my presenter implements a method for sorting which uses column header:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Sort(GridViewColumnHeader gridViewColumnHeader)
{
   var sortableGridViewColumn = 
          gridViewColumnHeader.Column &lt;span class="kwrd"&gt;as&lt;/span&gt; ISortableGridViewColumn;
   &lt;span class="kwrd"&gt;if&lt;/span&gt; (sortableGridViewColumn != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
   {
       MessageBox.Show(sortableGridViewColumn.SortPropertyName);
   }
}&lt;/pre&gt;

&lt;p&gt;The only problem now is that my presenter is aware of GridViewColumnHeader which I don’t like much but I can’t find a way of creating a GridViewColumnHeader template which will be able to set a SortProperty name from SortableGridViewColumn&amp;#160; as parameter. If I did that I will update this post :-)&lt;/p&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7356591" width="1" height="1"&gt;</content><author><name>xmonix</name><uri>http://weblogs.asp.net/members/xmonix.aspx</uri></author></entry><entry><title>Hello Caliburn – beginners guide to an amazing framework (1)</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/monikadyrda/archive/2009/10/26/hello-caliburn-begginners-guide-for-an-amazing-framework-1.aspx" /><id>http://weblogs.asp.net/monikadyrda/archive/2009/10/26/hello-caliburn-begginners-guide-for-an-amazing-framework-1.aspx</id><published>2009-10-26T19:46:00Z</published><updated>2009-10-26T19:46:00Z</updated><content type="html">&lt;p&gt;I knew about &lt;a href="http://www.codeplex.com/caliburn" mce_href="http://www.codeplex.com/caliburn"&gt;Caliburn&lt;/a&gt; for some time but never really tried it until I've found a very simple solution to a problem that appeared complicated. After struggling a bit and asking some newbie-stupid questions on twitter I've decided to get to know the framework from the beginning. And of course I was trying to understand a big sample before reading any documentation so everything seemed very hard and complicated. Since I could not find any tutorial with a legendary 'hello caliburn' application I've decided to write one - for me to remember basics and maybe for someone else to get them too. &lt;/p&gt;  &lt;p&gt;Caliburn gives a WPF developer a lot of helpers but for me the most important was to make me use presentation patterns properly, make my code neat, well organized, easy to read. I also hope to learn some about testability goods that comes with using Caliburn. This post is based on an application given as a sample with the release and shows how to build a very first Cliburn application. &lt;/p&gt;  &lt;h4&gt;CaliburnApplication&lt;/h4&gt;  &lt;p&gt;To make things easiest possible I've decided not to try &lt;a href="http://caliburn.codeplex.com/wikipage?title=Application&amp;amp;referringTitle=Documentation" mce_href="http://caliburn.codeplex.com/wikipage?title=Application&amp;amp;referringTitle=Documentation" tooltip="linkalert-tip"&gt;manual configuration&lt;/a&gt; and use a CaliburnApplication class. It configured everything I needed. Now my application is:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Caliburn.PresentationFramework.ApplicationModel;&lt;br&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; HelloCaliburn&lt;br&gt;{&lt;br&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; App : CaliburnApplication{}&lt;br&gt;}&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ApplicationModel:CaliburnApplication&lt;/span&gt; &lt;span class="attr"&gt;x:Class&lt;/span&gt;&lt;span class="kwrd"&gt;="HelloCaliburn.App"&lt;/span&gt;&lt;br&gt;   &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt;&lt;br&gt;   &lt;span class="attr"&gt;xmlns:x&lt;/span&gt;&lt;span class="kwrd"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&lt;br&gt;   &lt;span class="attr"&gt;xmlns:ApplicationModel&lt;/span&gt;&lt;span class="kwrd"&gt;="clr-namespace:&lt;br&gt;   Caliburn.PresentationFramework.ApplicationModel;&lt;br&gt;   assembly=Caliburn.PresentationFramework"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ApplicationModel:CaliburnApplication&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;

&lt;h4&gt;View&lt;/h4&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Window&lt;/span&gt; &lt;span class="attr"&gt;x:Class&lt;/span&gt;&lt;span class="kwrd"&gt;="HelloCaliburn.Views.MainView"&lt;/span&gt;&lt;br&gt;   &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt;&lt;br&gt;   &lt;span class="attr"&gt;xmlns:x&lt;/span&gt;&lt;span class="kwrd"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&lt;br&gt;   &lt;span class="attr"&gt;Title&lt;/span&gt;&lt;span class="kwrd"&gt;="Hello"&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="300"&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;="300"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Label&lt;/span&gt; &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;="50"&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;="Hello Caliburn! :-)"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Window&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;h4&gt;&lt;span class="kwrd"&gt;Presenter&lt;/span&gt;&lt;/h4&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; HelloCaliburn.Presenters&lt;br&gt;{&lt;br&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MainPresenter : IMainPresenter {}&lt;br&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IMainPresenter {}&lt;br&gt;}&lt;/pre&gt;

&lt;p&gt;The only important thing to remember is naming conventions. Views should be named: My.Namespace.Views.NameView and presenters My.Namespace.Presenters.NamePresenter
  &lt;br&gt;It helps to have the same folders names (another benefit of Caliburn - I've learned that naming and putting things in common places is good and important) &lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/monikadyrda/image_51A8C559.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/monikadyrda/image_thumb_16E11C83.png" style="border: 0px none ; display: inline;" title="image" alt="image" border="0" height="212" width="230"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h4&gt;&lt;/h4&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;h4&gt;&lt;b&gt;&lt;/b&gt;Final application&lt;/h4&gt;

&lt;p&gt;One small method in the application class:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; App : CaliburnApplication&lt;br&gt;{&lt;br&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; CreateRootModel()&lt;br&gt;    {&lt;br&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; Container.GetInstance&amp;lt;IMainPresenter&amp;gt;();&lt;br&gt;    }&lt;br&gt;}&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;One attribute to register my presenter:&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;[PerRequest( &lt;span class="kwrd"&gt;typeof&lt;/span&gt;( IMainPresenter ) )]&lt;br&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MainPresenter : IMainPresenter&lt;br&gt;{&lt;br&gt;}&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;Hit F5 and done :-)&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;&lt;a href="http://weblogs.asp.net/blogs/monikadyrda/image_1E6E8DCB.png" mce_href="http://weblogs.asp.net/blogs/monikadyrda/image_1E6E8DCB.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/monikadyrda/image_thumb_681D65BB.png" style="border: 0px none ; display: inline;" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/monikadyrda/image_thumb_681D65BB.png" border="0" height="177" width="226"&gt;&lt;/a&gt; &lt;/pre&gt;

&lt;pre class="csharpcode"&gt;Happy caliburning ;-) Code &lt;a href="http://weblogs.asp.net/blogs/monikadyrda/HelloCaliburn.zip" mce_href="http://weblogs.asp.net/blogs/monikadyrda/HelloCaliburn.zip"&gt;here&lt;/a&gt;,&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;Monika&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7239914" width="1" height="1"&gt;</content><author><name>xmonix</name><uri>http://weblogs.asp.net/members/xmonix.aspx</uri></author><category term="WPF" scheme="http://weblogs.asp.net/monikadyrda/archive/tags/WPF/default.aspx" /><category term="Caliburn" scheme="http://weblogs.asp.net/monikadyrda/archive/tags/Caliburn/default.aspx" /></entry><entry><title>WPF: ListCollectionView for sorting, filtering and grouping</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/monikadyrda/archive/2009/08/31/wpf-listcollectionview-for-sorting-filtering-and-grouping.aspx" /><id>http://weblogs.asp.net/monikadyrda/archive/2009/08/31/wpf-listcollectionview-for-sorting-filtering-and-grouping.aspx</id><published>2009-08-31T18:00:00Z</published><updated>2009-08-31T18:00:00Z</updated><content type="html">&lt;p&gt;I have written before that I need and like WPF lists (ListBox, ListView..) very much. Now I'd like to share a method to manipulate the view when being simply bound to a collection without touching this collection. It can be done in xaml as shown &lt;a href="http://msdn.microsoft.com/en-us/library/ms742542.aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms742542.aspx"&gt;here&lt;/a&gt; but I don't like this approach very much because in my opinion operations like sorting, grouping belong to view model not directly view and no tests will be available if they are in view.&lt;/p&gt;  &lt;h4&gt;Example&lt;/h4&gt;  &lt;p&gt;So the sample problem is we have a view with a ListBox which ItemsSource is bound to an ObservableCollection. In my example I have a list of True Blood characters. Each creature has first name, last name, age (made up) and kind (it can be either vampire, human or mystery). A model of creature is (very simple just to have some data):   &lt;br&gt;&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CreatureModel&lt;br&gt;{&lt;br&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; CreatureModel( &lt;span class="kwrd"&gt;string&lt;/span&gt; firstName, &lt;span class="kwrd"&gt;string&lt;/span&gt; lastName, &lt;span class="kwrd"&gt;int&lt;/span&gt; age, &lt;br&gt;                               CreatureKind kind )&lt;br&gt;       {&lt;br&gt;           &lt;span class="kwrd"&gt;this&lt;/span&gt;.FirstName = firstName;&lt;br&gt;           &lt;span class="kwrd"&gt;this&lt;/span&gt;.LastName = lastName;&lt;br&gt;           &lt;span class="kwrd"&gt;this&lt;/span&gt;.Age = age;&lt;br&gt;           &lt;span class="kwrd"&gt;this&lt;/span&gt;.Kind = kind;&lt;br&gt;       }&lt;br&gt;&lt;br&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; FirstName { get; set; }&lt;br&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; LastName { get; set; }&lt;br&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Age { get; set; }&lt;br&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; CreatureKind Kind { get; set; }&lt;br&gt;&lt;br&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ToString()&lt;br&gt;       {&lt;br&gt;           &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format( &lt;span class="str"&gt;"{0} {1} {2} {3}"&lt;/span&gt;, &lt;span class="kwrd"&gt;this&lt;/span&gt;.FirstName,&lt;br&gt;                            &lt;span class="kwrd"&gt;this&lt;/span&gt;.LastName, &lt;span class="kwrd"&gt;this&lt;/span&gt;.Age, &lt;span class="kwrd"&gt;this&lt;/span&gt;.Kind );&lt;br&gt;       }&lt;br&gt;   }&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;
  &lt;br&gt;View is contains a ListBox and three buttons:

  &lt;br&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ListBox&lt;/span&gt; &lt;span class="attr"&gt;ItemsSource&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding Path=CreaturesCollection}"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;="Sort by age"&lt;/span&gt; &lt;br&gt;   &lt;span class="attr"&gt;Command&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding Path=SortByAgeCommand}"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;="Filter Vampires"&lt;/span&gt; &lt;br&gt;   &lt;span class="attr"&gt;Command&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding Path=FilterVampiresCommand}"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;="Group by kind"&lt;/span&gt; &lt;br&gt;   &lt;span class="attr"&gt;Command&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding Path=GroupByKindCommand}"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;View model for this problem is also simple – we need a collection of creatures and commands for sorting, filtering and grouping:
  &lt;br&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; ObservableCollection&amp;lt;CreatureModel&amp;gt; CreaturesCollection &lt;br&gt;       { get; &lt;span class="kwrd"&gt;private&lt;/span&gt; set; }&lt;br&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; ICommand SortByAgeCommand &lt;br&gt;       { get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; DelegateCommand(&lt;span class="kwrd"&gt;this&lt;/span&gt;.SortByAge ); } }&lt;br&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; ICommand FilterVampiresCommand &lt;br&gt;       { get { &lt;span class="kwrd"&gt;return&lt;/span&gt; new DelegateCommand( &lt;span class="kwrd"&gt;this&lt;/span&gt;.FilterVampires ); } }&lt;br&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; ICommand GroupByKindCommand &lt;br&gt;       { get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; DelegateCommand(&lt;span class="kwrd"&gt;this&lt;/span&gt;.GroupByKind ); } }&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;And now all the magic needed to implement three methods – parameters in DelegateCommand constructor is this method:
  &lt;br&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; ListCollectionView GetListCollectionView()&lt;br&gt;{&lt;br&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; (ListCollectionView) CollectionViewSource&lt;br&gt;                    .GetDefaultView( &lt;span class="kwrd"&gt;this&lt;/span&gt;.CreaturesCollection );&lt;br&gt;}&lt;/pre&gt;

&lt;h4&gt;CollectionViewSource&lt;/h4&gt;

&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource.aspx"&gt;&lt;/a&gt;

  &lt;br&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource.aspx"&gt;CollectionViewSource&lt;/a&gt;&amp;nbsp; – when you set a binding to a collection, WPF makes it a binding to the default view for that collection. CollectionViewSource has a static method that lets getting this default view: CollectionViewSource.GetDefaultView and on the view filtering, grouping, sorting can be easily applied ListCollectionView is a default view for collections implementing IList.&lt;/p&gt;

&lt;h4&gt;Sorting – ListCollectionView.CustomSort &lt;/h4&gt;

&lt;p&gt;To apply sorting an implementation of IComperer is needed and it can be any implementation of this interface. I will use one that simply sorts creatures by age:
  &lt;br&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; SortCreaturesByAge : IComparer&lt;br&gt;{&lt;br&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Compare( &lt;span class="kwrd"&gt;object&lt;/span&gt; x, &lt;span class="kwrd"&gt;object&lt;/span&gt; y )&lt;br&gt;    {&lt;br&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt;( x &lt;span class="kwrd"&gt;as&lt;/span&gt; CreatureModel == &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; y &lt;span class="kwrd"&gt;as&lt;/span&gt; CreatureModel == &lt;span class="kwrd"&gt;null&lt;/span&gt; )&lt;br&gt;        {&lt;br&gt;            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentException( &lt;span class="str"&gt;"SortCreatures can &lt;br&gt;                                    only sort CreatureModel objects."&lt;/span&gt; );&lt;br&gt;        }&lt;br&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt;( ((CreatureModel) x).Age &amp;gt; ((CreatureModel) y).Age )&lt;br&gt;        {&lt;br&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; 1;&lt;br&gt;        }&lt;br&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; -1;&lt;br&gt;    }&lt;br&gt;   }&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;
  &lt;br&gt;Now I can implement a method used for SortByAgeCommand by setting CustomSort on ListCollectionView:

  &lt;br&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; ICommand SortByAgeCommand &lt;br&gt;       { get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; DelegateCommand(&lt;span class="kwrd"&gt;this&lt;/span&gt;.SortByAge ); } }&lt;br&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SortByAge()&lt;br&gt;{&lt;br&gt;    &lt;span class="kwrd"&gt;this&lt;/span&gt;.GetListCollectionView().CustomSort = &lt;span class="kwrd"&gt;new&lt;/span&gt; SortCreaturesByAge();&lt;br&gt;}&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;
  &lt;br&gt;Unsorted and sorted collection: &lt;/p&gt;

&lt;p&gt;
  &lt;br&gt;&lt;a href="http://weblogs.asp.net/blogs/monikadyrda/image_685D88FA.png" mce_href="http://weblogs.asp.net/blogs/monikadyrda/image_685D88FA.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/monikadyrda/image_thumb_5FF9B3A3.png" style="border: 0px none ; display: inline;" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/monikadyrda/image_thumb_5FF9B3A3.png" border="0" height="244" width="244"&gt;&lt;/a&gt; &lt;a href="http://weblogs.asp.net/blogs/monikadyrda/image_377AD18F.png" mce_href="http://weblogs.asp.net/blogs/monikadyrda/image_377AD18F.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/monikadyrda/image_thumb_1210DE21.png" style="border: 0px none ; display: inline;" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/monikadyrda/image_thumb_1210DE21.png" border="0" height="244" width="244"&gt;&lt;/a&gt; 

  &lt;br&gt;&lt;/p&gt;

&lt;h4&gt;Filtering – ListCollectionView. Filter&lt;/h4&gt;

&lt;p&gt;I would like to implement a filter which shows only vampires from the list of creatures. Filter is a &lt;a href="http://msdn.microsoft.com/en-us/library/bfcke1bz.aspx" mce_href="http://msdn.microsoft.com/en-us/library/bfcke1bz.aspx"&gt;Predicate&amp;lt;bool&amp;gt;&lt;/a&gt;. Even simpler than in sorting, we just need

  &lt;br&gt;a method that returns a bool deciding whether a parameter object is what we need:

  &lt;br&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsAVampire( &lt;span class="kwrd"&gt;object&lt;/span&gt; obj )&lt;br&gt;{&lt;br&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt;(obj &lt;span class="kwrd"&gt;as&lt;/span&gt; CreatureModel != &lt;span class="kwrd"&gt;null&lt;/span&gt; &lt;br&gt;       &amp;amp;&amp;amp; (obj &lt;span class="kwrd"&gt;as&lt;/span&gt; CreatureModel).Kind == CreatureKind.Vampire)&lt;br&gt;    {&lt;br&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br&gt;    }&lt;br&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br&gt;}&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;
  &lt;br&gt;Clicking on “Filter vampires” shows only vampires :-) &lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/monikadyrda/image_0723D70C.png" mce_href="http://weblogs.asp.net/blogs/monikadyrda/image_0723D70C.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/monikadyrda/image_thumb_1EDB0E72.png" style="border: 0px none ; display: inline;" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/monikadyrda/image_thumb_1EDB0E72.png" border="0" height="244" width="244"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h4&gt;Grouping&lt;/h4&gt;

&lt;p&gt;I would like to group all creatures on my list by kind. Kind is an enum:
  &lt;br&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;enum&lt;/span&gt; CreatureKind&lt;br&gt;{&lt;br&gt;    Human,&lt;br&gt;    Vampire,&lt;br&gt;    Mystery&lt;br&gt;}&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;
  &lt;br&gt;Again ListCollectionView comes with a solution. All needed to be done is adding a property name that grouping will be based on. I this exaple – kind:

  &lt;br&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; ICommand GroupByKindCommand &lt;br&gt;       { get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; DelegateCommand(&lt;span class="kwrd"&gt;this&lt;/span&gt;.GroupByKind ); } }&lt;br&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; GroupByKind()&lt;br&gt;{&lt;br&gt;    &lt;span class="kwrd"&gt;this&lt;/span&gt;.GetListCollectionView().GroupDescriptions.Add( &lt;br&gt;             &lt;span class="kwrd"&gt;new&lt;/span&gt; PropertyGroupDescription { PropertyName = &lt;span class="str"&gt;"Kind"&lt;/span&gt; } );       &lt;br&gt;}&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;
  &lt;br&gt;Now list can be grouped: &lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/monikadyrda/image_369245D8.png" mce_href="http://weblogs.asp.net/blogs/monikadyrda/image_369245D8.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/monikadyrda/image_thumb_02117390.png" style="border: 0px none ; display: inline;" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/monikadyrda/image_thumb_02117390.png" border="0" height="244" width="244"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h4&gt;Sum up&lt;/h4&gt;

&lt;p&gt;Grouping, filtering and sorting are supported by WPF very well and are easy to apply. I feel that my example is very basic and like always in WPF lots of customising can be done here. Next thing I plan to discover is a neat and smart way of setting data templates and styles for this kind of problems.
  &lt;br&gt;&lt;/p&gt;

&lt;p&gt;Code &lt;a href="http://weblogs.asp.net/blogs/monikadyrda/CollectionViews.zip" mce_href="http://weblogs.asp.net/blogs/monikadyrda/CollectionViews.zip"&gt;here&lt;/a&gt;. As always any suggestions very welcome.&lt;/p&gt;

&lt;p&gt;
  &lt;br&gt;Monika&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7186641" width="1" height="1"&gt;</content><author><name>xmonix</name><uri>http://weblogs.asp.net/members/xmonix.aspx</uri></author><category term="WPF" scheme="http://weblogs.asp.net/monikadyrda/archive/tags/WPF/default.aspx" /></entry><entry><title>Seadragon is so cool! ;-)</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/monikadyrda/archive/2009/08/07/seadragon-is-so-cool.aspx" /><id>http://weblogs.asp.net/monikadyrda/archive/2009/08/07/seadragon-is-so-cool.aspx</id><published>2009-08-07T08:52:00Z</published><updated>2009-08-07T08:52:00Z</updated><content type="html">
&lt;p&gt;&amp;nbsp;I know this post may be useless for most people but I've been looking at seadragon and found it so cool I can't resist... :-)&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &lt;script src="http://seadragon.com/embed/4np.js?width=auto&amp;amp;height=400px" mce_src="http://seadragon.com/embed/4np.js?width=auto&amp;amp;height=400px"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7163342" width="1" height="1"&gt;</content><author><name>xmonix</name><uri>http://weblogs.asp.net/members/xmonix.aspx</uri></author></entry><entry><title>WPF TextBox validation 2</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/monikadyrda/archive/2009/07/28/wpf-textbox-validation-2.aspx" /><id>http://weblogs.asp.net/monikadyrda/archive/2009/07/28/wpf-textbox-validation-2.aspx</id><published>2009-07-28T17:13:00Z</published><updated>2009-07-28T17:13:00Z</updated><content type="html">&lt;p&gt;Many people asked me how to enable/disable button depending on a few TextBoxes. I would strongly recommend &lt;a href="http://www.codeplex.com/caliburn" mce_href="http://www.codeplex.com/caliburn"&gt;Caliburn&lt;/a&gt; but I know not everyone can use it. So I’ve decided to post a very simple solution to that problem.&lt;/p&gt;  &lt;p&gt;First of all we need a ViewModel and I will use a very simple class which has IsValid method – checking if data is valid, ICommand property to be bound to a Button and an action to be executed when the button is pressed.&lt;/p&gt;  &lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;class&lt;/span&gt; PersonViewModel&lt;br&gt;    {&lt;br&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Name { get; set; }&lt;br&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Age { get; set; }&lt;br&gt;&lt;br&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsValid()&lt;br&gt;        {&lt;br&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt;(&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(&lt;span class="kwrd"&gt;this&lt;/span&gt;.Name))&lt;br&gt;            {&lt;br&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br&gt;            }&lt;br&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt;.Age &amp;lt; 5 || &lt;span class="kwrd"&gt;this&lt;/span&gt;.Age &amp;gt; 120)&lt;br&gt;            {&lt;br&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br&gt;            }&lt;br&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br&gt;        }&lt;br&gt;&lt;br&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ICommand OkCommand&lt;br&gt;        {&lt;br&gt;            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; DelegatedCommand(&lt;span class="kwrd"&gt;this&lt;/span&gt;.OkAction, &lt;span class="kwrd"&gt;this&lt;/span&gt;.IsValid); }&lt;br&gt;        }&lt;br&gt;&lt;br&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OkAction()&lt;br&gt;        {&lt;br&gt;            MessageBox.Show(&lt;span class="str"&gt;"ok!"&lt;/span&gt;);&lt;br&gt;        }&lt;br&gt;    }&lt;/pre&gt;

&lt;p&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;TextBox.Text properties can now be bound to properties of this class and button’s command can be bound to OkCommand. Automatically button will be enable when command can be executed and disabled when command cannot be executed:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TextBox&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding Path=Name}"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TextBox&lt;/span&gt;  &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding Path=Age}"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Command&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding Path=OkCommand}"&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;="ok"/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;My ICommand implementation in this example is very naive. Maybe a better one in a next post? :-)&lt;/p&gt;

&lt;p&gt;Results disabled and enabled:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/monikadyrda/image_68A5F7BA.png" mce_href="http://weblogs.asp.net/blogs/monikadyrda/image_68A5F7BA.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/monikadyrda/image_thumb_728AE925.png" style="border: 0px none ; display: inline;" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/monikadyrda/image_thumb_728AE925.png" border="0" height="140" width="244"&gt;&lt;/a&gt; &lt;a href="http://weblogs.asp.net/blogs/monikadyrda/image_5F69BC79.png" mce_href="http://weblogs.asp.net/blogs/monikadyrda/image_5F69BC79.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/monikadyrda/image_thumb_37570D5A.png" style="border: 0px none ; display: inline;" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/monikadyrda/image_thumb_37570D5A.png" border="0" height="140" width="244"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Code &lt;a href="http://weblogs.asp.net/blogs/monikadyrda/ValidationExamples2.zip" mce_href="http://weblogs.asp.net/blogs/monikadyrda/ValidationExamples2.zip"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Monika&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7156012" width="1" height="1"&gt;</content><author><name>xmonix</name><uri>http://weblogs.asp.net/members/xmonix.aspx</uri></author><category term="WPF" scheme="http://weblogs.asp.net/monikadyrda/archive/tags/WPF/default.aspx" /></entry><entry><title>WPF ToolTip Content binding</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/monikadyrda/archive/2009/07/10/wpf-tooltip-content-binding.aspx" /><id>http://weblogs.asp.net/monikadyrda/archive/2009/07/10/wpf-tooltip-content-binding.aspx</id><published>2009-07-10T14:19:00Z</published><updated>2009-07-10T14:19:00Z</updated><content type="html">&lt;p&gt;Did you know that content of a ToolTip is neither a part of visual nor logical &lt;a href="http://msdn.microsoft.com/en-us/library/ms753391.aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms753391.aspx"&gt;tree&lt;/a&gt;? I didn't so I was trying to bind a ToolTip.Content using ElementName. And it didn't work:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TextBlock&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;box&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Text to place inside tooltip&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Can't Bind&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button.ToolTip&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;               &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ToolTip&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding ElementName=box, &lt;br /&gt;                                                Path=Text}&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Button.ToolTip&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Button has a tiny empty tooltip:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/monikadyrda/EmptyTooltip_02A20CFB.jpg" mce_href="http://weblogs.asp.net/blogs/monikadyrda/EmptyTooltip_02A20CFB.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="EmptyTooltip" border="0" alt="EmptyTooltip" src="http://weblogs.asp.net/blogs/monikadyrda/EmptyTooltip_thumb_0442B302.jpg" width="244" height="244" mce_src="http://weblogs.asp.net/blogs/monikadyrda/EmptyTooltip_thumb_0442B302.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;This code seemed perfectly fine for me so it took me a lot of time to google the answer. The only way to make that binding happen doesn't look nice but it's a simple trick: bind to a Grid DataContext. Seriously :-)&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt; &lt;span class="attr"&gt;DataContext&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding ElementName=box, Path=Text}&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;     &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Tricky Evil Solution ;-)&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;     &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid.ToolTip&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ToolTip&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding Path=PlacementTarget.DataContext, &lt;br /&gt;                                       RelativeSource={RelativeSource Self}}&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid.ToolTip&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;And now the tooltip looks ok:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/monikadyrda/WorkingTooltip_0A1D569B.jpg" mce_href="http://weblogs.asp.net/blogs/monikadyrda/WorkingTooltip_0A1D569B.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="WorkingTooltip" border="0" alt="WorkingTooltip" src="http://weblogs.asp.net/blogs/monikadyrda/WorkingTooltip_thumb_08D8BDBC.jpg" width="244" height="244" mce_src="http://weblogs.asp.net/blogs/monikadyrda/WorkingTooltip_thumb_08D8BDBC.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;My original problem was binding a ToolTip.Content to validation errors and I really needed a way to do that. Please tell me if you know a better one :-) 
  &lt;br /&gt;Code can be found &lt;a href="http://weblogs.asp.net/blogs/monikadyrda/ToolTip.zip" mce_href="http://weblogs.asp.net/blogs/monikadyrda/ToolTip.zip"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Monika&lt;/p&gt;

&lt;p&gt;Update: This works too! :-)&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;ToolTip&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding ElementName=box, Path=Text}&amp;quot;&lt;/span&gt;  &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7144735" width="1" height="1"&gt;</content><author><name>xmonix</name><uri>http://weblogs.asp.net/members/xmonix.aspx</uri></author></entry><entry><title>WPF TextBox Validation</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/monikadyrda/archive/2009/06/24/wpf-textbox-validation.aspx" /><id>http://weblogs.asp.net/monikadyrda/archive/2009/06/24/wpf-textbox-validation.aspx</id><published>2009-06-24T16:05:00Z</published><updated>2009-06-24T16:05:00Z</updated><content type="html">&lt;p&gt;Sample problem: set parameter by entering value into a TextBox, check if value is a number in given range, allow clicking a Button if validation was successful.&lt;/p&gt;  &lt;h4&gt;ValidationRule&lt;/h4&gt;  &lt;p&gt;ValidationRule is an abstract class from System.Windows.Controls that helps creating custom validation rules for user input.&amp;#160; In this example a derived class DoubleRangeRule will check if user entered a number (double) within a given range (between Max and Min value).&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; DoubleRangeRule : ValidationRule&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; Min { get; set; }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; Max { get; set; }&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; ValidationResult Validate( &lt;span class="kwrd"&gt;object&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;br /&gt;                                                   CultureInfo cultureInfo )&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;double&lt;/span&gt; parameter = 0;&lt;br /&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt;( ((&lt;span class="kwrd"&gt;string&lt;/span&gt;) &lt;span class="kwrd"&gt;value&lt;/span&gt;).Length &amp;gt; 0 )&lt;br /&gt;                {&lt;br /&gt;                    parameter = Double.Parse( (String) &lt;span class="kwrd"&gt;value&lt;/span&gt; );&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            &lt;span class="kwrd"&gt;catch&lt;/span&gt;( Exception e )&lt;br /&gt;            {&lt;br /&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ValidationResult( &lt;span class="kwrd"&gt;false&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Illegal characters or &amp;quot;&lt;/span&gt; &lt;br /&gt;                                             + e.Message );&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt;( (parameter &amp;lt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.Min) || (parameter &amp;gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.Max) )&lt;br /&gt;            {&lt;br /&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ValidationResult( &lt;span class="kwrd"&gt;false&lt;/span&gt;, &lt;br /&gt;                    &lt;span class="str"&gt;&amp;quot;Please enter value in the range: &amp;quot;&lt;/span&gt; &lt;br /&gt;                    + &lt;span class="kwrd"&gt;this&lt;/span&gt;.Min + &lt;span class="str"&gt;&amp;quot; - &amp;quot;&lt;/span&gt; + &lt;span class="kwrd"&gt;this&lt;/span&gt;.Max + &lt;span class="str"&gt;&amp;quot;.&amp;quot;&lt;/span&gt; );&lt;br /&gt;            }&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ValidationResult( &lt;span class="kwrd"&gt;true&lt;/span&gt;, &lt;span class="kwrd"&gt;null&lt;/span&gt; );&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h4&gt;Validation.ErrorTemplate&lt;/h4&gt;

&lt;p&gt;Having defined ValidationRule as above if user input is invalid, TextBox will have a red border. Like everything in WPF it is possible to customize it by setting a custom ControlTemplate. My template shows a warning sign and a label explaining error made by user (why input is invalid):&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ControlTemplate&lt;/span&gt; &lt;span class="attr"&gt;x:Key&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;TextBoxErrorTemplate&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt; &lt;span class="attr"&gt;Orientation&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Horizontal&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Image&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;16&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0,0,5,0&amp;quot;&lt;/span&gt; &lt;br /&gt;                    &lt;span class="attr"&gt;Source&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Assets/warning_48.png&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;AdornedElementPlaceholder&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Holder&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Label&lt;/span&gt; &lt;span class="attr"&gt;Foreground&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Red&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding ElementName=Holder, &lt;br /&gt;               Path=AdornedElement.(Validation.Errors)[0].ErrorContent}&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ControlTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Read more about AdornedElement &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.adornedelementplaceholder.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.windows.controls.adornedelementplaceholder.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;Binding to validation result&lt;/h4&gt;

&lt;p&gt;On the result of validation can depend many things. For example I would like to bind button IsEnabled property to that deciding to enable button only in user input is valid. Simplest way, in my opinion is to check if TextBox has any validation errors and if no – make button enabled, disabled otherwise. With TextBox called Box (x:Name) binding of Button's IsEnabled property looks like that:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;IsEnabled=&amp;quot;{Binding ElementName=Box, Path=(Validation.Errors)[0], &lt;br /&gt;Converter={StaticResource buttonEnabled}}&amp;quot;&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h4&gt;Final app&lt;/h4&gt;

&lt;p&gt;
  &lt;br /&gt;Finally we get a TexBbox with validation rules, tips on incorrect input and a Button bound to correctness of input.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TextBox&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Box&amp;quot;&lt;/span&gt; &lt;br /&gt;         &lt;span class="attr"&gt;Validation&lt;/span&gt;.&lt;span class="attr"&gt;ErrorTemplate&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{StaticResource TextBoxErrorTemplate}&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TextBox.Text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Binding&lt;/span&gt; &lt;span class="attr"&gt;Path&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ValueInBox&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;UpdateSourceTrigger&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;PropertyChanged&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Binding.ValidationRules&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ValidationExpamples:DoubleRangeRule&lt;/span&gt; &lt;span class="attr"&gt;Min&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;0.5&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Max&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;10&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Binding.ValidationRules&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Binding&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;TextBox.Text&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;           &lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;TextBox&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt;  &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;SaveChanges&amp;quot;&lt;/span&gt; &lt;br /&gt;         &lt;span class="attr"&gt;IsEnabled&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{Binding ElementName=Box, Path=(Validation.Errors)[0], &lt;br /&gt;         Converter={StaticResource buttonEnabled}}&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/monikadyrda/CorrectValue_4ADAD4E9.jpg" mce_href="http://weblogs.asp.net/blogs/monikadyrda/CorrectValue_4ADAD4E9.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="CorrectValue" border="0" alt="CorrectValue" src="http://weblogs.asp.net/blogs/monikadyrda/CorrectValue_thumb_3B57C31A.jpg" width="244" height="244" mce_src="http://weblogs.asp.net/blogs/monikadyrda/CorrectValue_thumb_3B57C31A.jpg" /&gt;&lt;/a&gt; &lt;a href="http://weblogs.asp.net/blogs/monikadyrda/IncorrectValue_68007CF3.jpg" mce_href="http://weblogs.asp.net/blogs/monikadyrda/IncorrectValue_68007CF3.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="IncorrectValue" border="0" alt="IncorrectValue" src="http://weblogs.asp.net/blogs/monikadyrda/IncorrectValue_thumb_7FB7B459.jpg" width="244" height="244" mce_src="http://weblogs.asp.net/blogs/monikadyrda/IncorrectValue_thumb_7FB7B459.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;If anyone had an idea how to do things like that a better way comments would be much appreciated. VS2008 project &lt;a href="http://weblogs.asp.net/blogs/monikadyrda/ValidationExpamples.zip"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Monika&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7133566" width="1" height="1"&gt;</content><author><name>xmonix</name><uri>http://weblogs.asp.net/members/xmonix.aspx</uri></author></entry><entry><title>DeepZoomPix and my trip to Paris</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/monikadyrda/archive/2009/04/16/deepzoompix-and-my-trip-to-paris.aspx" /><id>http://weblogs.asp.net/monikadyrda/archive/2009/04/16/deepzoompix-and-my-trip-to-paris.aspx</id><published>2009-04-16T14:59:00Z</published><updated>2009-04-16T14:59:00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;&lt;a href="http://deepzoompix.com/" mce_href="http://deepzoompix.com/"&gt;DeepZoomPix&lt;/a&gt; is just amazing! Easy to use with great way of showing the world your photos. And it's Silverlight and Azure... :-)&lt;br&gt;&lt;/p&gt;

&lt;iframe src="http://deepzoompix.com/DZApp/IFrame.aspx?alias=xmonix&amp;amp;album=2" mce_src="http://deepzoompix.com/DZApp/IFrame.aspx?alias=xmonix&amp;amp;album=2" scrolling="no" width="425" frameborder="0" height="344"&gt;&lt;/iframe&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7048190" width="1" height="1"&gt;</content><author><name>xmonix</name><uri>http://weblogs.asp.net/members/xmonix.aspx</uri></author><category term="DeepZoomPix" scheme="http://weblogs.asp.net/monikadyrda/archive/tags/DeepZoomPix/default.aspx" /></entry><entry><title>Master-Detail patter implemented using WPF</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/monikadyrda/archive/2009/03/13/master-detail-patter-implemented-using-wpf.aspx" /><id>http://weblogs.asp.net/monikadyrda/archive/2009/03/13/master-detail-patter-implemented-using-wpf.aspx</id><published>2009-03-13T14:49:00Z</published><updated>2009-03-13T14:49:00Z</updated><content type="html">  &lt;p&gt;The master-detail pattern is a very neat way of displaying and organizing data that falls within some hierarchy. It is a quite efficient way of creating a custom user experience by allowing the user to start from various entry points and navigate to the items they are interested in. Master-detail pattern is used in almost all desktop and web applications so recently I also came across a problem that needed its implementation. If you've never done that and you like data binding as much as I do keep reading to see how it can be done in WPF :-)&lt;/p&gt;&lt;p&gt;Problem definition: I have a list of animal species and a list of examples for each of the species. Every example have some additional information. I would like to organize it nicely into two lists (species, examples) and a custom way of displaying the additional information. User will choose a species and see a list of examples, than he will choose an example an see the details.     &lt;br&gt;&lt;/p&gt;  &lt;p&gt;Master-detail solution: (1) the list of species is a master for the examples list, the examples list is a detail for each item in the list of species (2) the examples list is a master for additional information, additional information is a detail for each item in the list of examples. So my solution will use master-detail patter twice.    &lt;br&gt;&lt;/p&gt;  &lt;p&gt;Implementation details: LifeSource is an object of a data source containing all data I need to create this example. First of all I bind a collection of Spiecies to items source of a ListBox:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ListBoxName&lt;/span&gt;&lt;span class="kwrd"&gt;="SpeciesListBox"&lt;/span&gt; &lt;br&gt;    &lt;span class="attr"&gt;ItemsSource&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding Path=LifeSource.SpeciesCollection}"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Than another list box items source is bound to a selected element from the first one (species – examples):&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ListBox&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="AnimalsListBox"&lt;/span&gt; &lt;span class="attr"&gt;ItemsSource&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding &lt;br&gt;    Path=SelectedItem.Animals, ElementName=SpeciesListBox}"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;And last binding – some controls which will show the additional information about items from AnimalsListBox:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Label&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding Path=SelectedItem.Name, &lt;br&gt;                 Mode=OneWay, ElementName=AnimalsListBox}"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; &lt;br&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Label&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding Path=SelectedItem.LatinName, &lt;br&gt;                 Mode=OneWay, ElementName=AnimalsListBox}"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Image&lt;/span&gt; &lt;span class="attr"&gt;Source&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding Path=SelectedItem.Photo, &lt;br&gt;                Mode=OneWay, ElementName=AnimalsListBox}"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Finally the master-detail animal show (selected items have blue background):&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/monikadyrda/MasterDetailScreen_10723735.jpg" mce_href="http://weblogs.asp.net/blogs/monikadyrda/MasterDetailScreen_10723735.jpg"&gt;&lt;img src="http://weblogs.asp.net/blogs/monikadyrda/MasterDetailScreen_thumb_07A22EE9.jpg" title="MasterDetailScreen" style="border-width: 0px; display: inline;" alt="MasterDetailScreen" mce_src="http://weblogs.asp.net/blogs/monikadyrda/MasterDetailScreen_thumb_07A22EE9.jpg" border="0" height="125" width="244"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/monikadyrda/MasterDetailExample.zip" mce_href="http://weblogs.asp.net/blogs/monikadyrda/MasterDetailExample.zip"&gt;Here&lt;/a&gt; you can find c#/xaml code and VS2008 project. All photos and information used in this example comes from &lt;a href="http://www.wikipedia.org/" mce_href="http://www.wikipedia.org/"&gt;Wikipedia&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6957380" width="1" height="1"&gt;</content><author><name>xmonix</name><uri>http://weblogs.asp.net/members/xmonix.aspx</uri></author><category term="WPF" scheme="http://weblogs.asp.net/monikadyrda/archive/tags/WPF/default.aspx" /></entry><entry><title>UX Design Patterns</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/monikadyrda/archive/2009/02/03/ux-design-patterns.aspx" /><id>http://weblogs.asp.net/monikadyrda/archive/2009/02/03/ux-design-patterns.aspx</id><published>2009-02-03T16:54:19Z</published><updated>2009-02-03T16:54:19Z</updated><content type="html">&lt;p&gt;Quince is a small Asian tree with pinkish flowers and pear-shaped fruit (&lt;a href="http://wordnetweb.princeton.edu/perl/webwn?s=quince"&gt;as described here).&lt;/a&gt; But there is another thing called &lt;a href="http://quince.infragistics.com/"&gt;Quince&lt;/a&gt;. It’s a great source of knowledge about UX patterns. &lt;/p&gt;  &lt;p&gt;I have found it very interesting and useful. Personal favorite: &lt;a href="http://quince.infragistics.com/#/Search/ViewPattern$pattern=Hub+and+Spoke"&gt;Hub and Spoke&lt;/a&gt;. Moreover in my opinion Quince itself is a very good example of well designed UI with amazing UX. So this evening I will dig in and hope to learn a lot :-)&lt;/p&gt;  &lt;p&gt;Monika&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6879011" width="1" height="1"&gt;</content><author><name>xmonix</name><uri>http://weblogs.asp.net/members/xmonix.aspx</uri></author><category term="UX" scheme="http://weblogs.asp.net/monikadyrda/archive/tags/UX/default.aspx" /></entry><entry><title>WPF Binding ItemsSource to Enum</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/monikadyrda/archive/2009/01/08/wpf-binding-itemssource-to-enum.aspx" /><id>http://weblogs.asp.net/monikadyrda/archive/2009/01/08/wpf-binding-itemssource-to-enum.aspx</id><published>2009-01-08T19:39:00Z</published><updated>2009-01-08T19:39:00Z</updated><content type="html">&lt;p&gt;I have found a very neat and simple way of binding an ItemControl to enum values. The trick is to use an ObjectDataProvider class which enables the creation of a XAML object available as a binding source.&lt;/p&gt;  &lt;p&gt;   &lt;br&gt;To show an example first of all I need an enum:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;enum&lt;/span&gt; SampleEnum&lt;br&gt;{&lt;br&gt;     Dog,&lt;br&gt;     Cat,&lt;br&gt;     Scrat,&lt;br&gt;     Hefalump&lt;br&gt;}&lt;/pre&gt;

&lt;p&gt;To make it available for binding I will define it as a resource with an x:Key.&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Window&lt;/span&gt; &lt;span class="attr"&gt;x:Class&lt;/span&gt;&lt;span class="kwrd"&gt;="WpfApplication1.Window1"&lt;/span&gt;&lt;br&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt;&lt;br&gt; &lt;span class="attr"&gt;xmlns:x&lt;/span&gt;&lt;span class="kwrd"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&lt;br&gt; &lt;span class="attr"&gt;xmlns:System&lt;/span&gt;&lt;span class="kwrd"&gt;="clr-namespace:System;assembly=mscorlib"&lt;/span&gt;&lt;br&gt; &lt;span class="attr"&gt;xmlns:local&lt;/span&gt;&lt;span class="kwrd"&gt;="clr-namespace:WpfApplication1"&lt;/span&gt;&lt;br&gt; &lt;span class="attr"&gt;Title&lt;/span&gt;&lt;span class="kwrd"&gt;="Bind to Enum"&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="250"&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;="250"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Window.Resources&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ObjectDataProvider&lt;/span&gt; &lt;span class="attr"&gt;x:Key&lt;/span&gt;&lt;span class="kwrd"&gt;="dataFromEnum"&lt;/span&gt;&lt;br&gt;       &lt;span class="attr"&gt;MethodName&lt;/span&gt;&lt;span class="kwrd"&gt;="GetValues"&lt;/span&gt; &lt;span class="attr"&gt;ObjectType&lt;/span&gt;&lt;span class="kwrd"&gt;="{x:Type System:Enum}"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ObjectDataProvider.MethodParameters&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;               &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;x:Type&lt;/span&gt; &lt;span class="attr"&gt;TypeName&lt;/span&gt;&lt;span class="kwrd"&gt;="local:SampleEnum"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;          &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ObjectDataProvider.MethodParameters&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ObjectDataProvider&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Window.Resources&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Window&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;This code creates the ObjectDataProvider in the window with ObjectType property set to Enum and MethodName property set to GetValues method of the Enum class. Then a specific enum (SampleEnum) is set to MethodParameter attribute.&lt;/p&gt;

&lt;p&gt;Having this resource we can bind it as an ItemsSource to a ListView and Combobox (or any other ItemsControl) by setting items source:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;ItemsSource="{Binding Source={StaticResource dataFromEnum}}"&lt;/pre&gt;

&lt;p&gt;The XAML for the window is as follows:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Window&lt;/span&gt; &lt;span class="attr"&gt;x:Class&lt;/span&gt;&lt;span class="kwrd"&gt;="WpfApplication1.Window1"&lt;/span&gt;&lt;br&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt;&lt;br&gt; &lt;span class="attr"&gt;xmlns:x&lt;/span&gt;&lt;span class="kwrd"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&lt;br&gt; &lt;span class="attr"&gt;xmlns:System&lt;/span&gt;&lt;span class="kwrd"&gt;="clr-namespace:System;assembly=mscorlib"&lt;/span&gt;&lt;br&gt; &lt;span class="attr"&gt;xmlns:local&lt;/span&gt;&lt;span class="kwrd"&gt;="clr-namespace:WpfApplication1"&lt;/span&gt;&lt;br&gt; &lt;span class="attr"&gt;Title&lt;/span&gt;&lt;span class="kwrd"&gt;="Bind to Enum"&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="250"&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;="250"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Window.Resources&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ObjectDataProvider&lt;/span&gt; &lt;span class="attr"&gt;x:Key&lt;/span&gt;&lt;span class="kwrd"&gt;="dataFromEnum"&lt;/span&gt;&lt;br&gt;       &lt;span class="attr"&gt;MethodName&lt;/span&gt;&lt;span class="kwrd"&gt;="GetValues"&lt;/span&gt; &lt;span class="attr"&gt;ObjectType&lt;/span&gt;&lt;span class="kwrd"&gt;="{x:Type System:Enum}"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ObjectDataProvider.MethodParameters&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;               &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;x:Type&lt;/span&gt; &lt;span class="attr"&gt;TypeName&lt;/span&gt;&lt;span class="kwrd"&gt;="local:SampleEnum"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;          &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ObjectDataProvider.MethodParameters&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ObjectDataProvider&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Window.Resources&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ListView&lt;/span&gt; &lt;span class="attr"&gt;ItemsSource&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding Source={StaticResource dataFromEnum}}"&lt;/span&gt;&lt;br&gt;      &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;="10,10,10,0"&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="80"&lt;/span&gt; &lt;span class="attr"&gt;VerticalAlignment&lt;/span&gt;&lt;span class="kwrd"&gt;="Top"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ComboBox&lt;/span&gt; &lt;span class="attr"&gt;ItemsSource&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding Source={StaticResource dataFromEnum}}"&lt;/span&gt;&lt;br&gt;      &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;="10,0,10,80"&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="25"&lt;/span&gt; &lt;span class="attr"&gt;VerticalAlignment&lt;/span&gt;&lt;span class="kwrd"&gt;="Bottom"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Window&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;The code behind for window is:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows;&lt;br&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; WpfApplication1&lt;br&gt;{&lt;br&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Window1 : Window&lt;br&gt;     {&lt;br&gt;          &lt;span class="kwrd"&gt;public&lt;/span&gt; Window1()&lt;br&gt;          {&lt;br&gt;               InitializeComponent();&lt;br&gt;          }&lt;br&gt;     }&lt;br&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;enum&lt;/span&gt; SampleEnum&lt;br&gt;     {&lt;br&gt;          Dog,&lt;br&gt;          Cat,&lt;br&gt;          Scrat,&lt;br&gt;          Hefalump&lt;br&gt;     }&lt;br&gt;}&lt;/pre&gt;

&lt;p&gt;And the result:&lt;/p&gt;

&lt;p&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;a href="http://weblogs.asp.net/blogs/monikadyrda/BindToEnum_4A19F05A.png" mce_href="http://weblogs.asp.net/blogs/monikadyrda/BindToEnum_4A19F05A.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/monikadyrda/BindToEnum_thumb_41B61B03.png" title="BindToEnum" style="border: 0px none ; display: inline;" alt="BindToEnum" mce_src="http://weblogs.asp.net/blogs/monikadyrda/BindToEnum_thumb_41B61B03.png" border="0" height="254" width="254"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Happy Binding! ;-)&lt;/p&gt;

&lt;p&gt;Monika&lt;/p&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6828156" width="1" height="1"&gt;</content><author><name>xmonix</name><uri>http://weblogs.asp.net/members/xmonix.aspx</uri></author><category term="WPF" scheme="http://weblogs.asp.net/monikadyrda/archive/tags/WPF/default.aspx" /></entry><entry><title>WPF Control content with curly braces</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/monikadyrda/archive/2009/01/07/wpf-control-content-with-curly-braces.aspx" /><id>http://weblogs.asp.net/monikadyrda/archive/2009/01/07/wpf-control-content-with-curly-braces.aspx</id><published>2009-01-07T19:01:00Z</published><updated>2009-01-07T19:01:00Z</updated><content type="html">
&lt;p&gt;For some people it is obvious but for me it was quite a discovery when I’ve found out how to insert curly braces into a Text or Content of a control. Surely you can’t simply write:&lt;/p&gt;
  
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;="{Curly braces here}"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;because in XAML, braces identify markup extension syntax and you would get a compiler error ( The tag 'Curly' does not exist in XML namespace…). &lt;/p&gt;

&lt;p&gt;Instead you should prefix the content with another pair of braces. Here is an example:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;="{}{Curly braces here}"&lt;/span&gt; &lt;br&gt;                    &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;="10"&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;="120"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TextBox&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;="{}{Curly braces there}"&lt;/span&gt; &lt;br&gt;             &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;="10"&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;="120"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Label&lt;/span&gt; &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;="{}{I can put them everywhere! ;-)}"&lt;/span&gt; &lt;br&gt;             &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;="10"&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;="180"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;And the result looks like that:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/monikadyrda/CurlyBraces_6A622012.png" mce_href="http://weblogs.asp.net/blogs/monikadyrda/CurlyBraces_6A622012.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/monikadyrda/CurlyBraces_6A622012.png" title="CurlyBraces" style="border-width: 0px; display: inline;" alt="CurlyBraces" mce_src="http://weblogs.asp.net/blogs/monikadyrda/CurlyBraces_6A622012.png" border="0" height="196" width="244"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;I recommend reading &lt;a href="http://www.apress.com/book/view/9781430210849" mce_href="http://www.apress.com/book/view/9781430210849"&gt;WPF Recipes in C# 2008: A Problem-Solution Approach&lt;/a&gt; which has tons of this kind of useful recipes.&lt;/p&gt;

&lt;p&gt;Monika&lt;/p&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6824022" width="1" height="1"&gt;</content><author><name>xmonix</name><uri>http://weblogs.asp.net/members/xmonix.aspx</uri></author><category term="WPF" scheme="http://weblogs.asp.net/monikadyrda/archive/tags/WPF/default.aspx" /></entry><entry><title>Merry Christmas!</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/monikadyrda/archive/2008/12/24/merry-christmas.aspx" /><id>http://weblogs.asp.net/monikadyrda/archive/2008/12/24/merry-christmas.aspx</id><published>2008-12-24T13:22:00Z</published><updated>2008-12-24T13:22:00Z</updated><content type="html">Merry Christmas and Happy New Year!

&lt;p&gt;
&lt;img src="http://weblogs.asp.net/blogs/monikadyrda/Choinka.jpg" title="ChristmasTree" style="border-width: 0px; display: inline;" alt="ChristmasTree" mce_src="http://weblogs.asp.net/blogs/monikadyrda/Choinka.jpg" width="400" border="0" height="300"&gt;
&lt;/p&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6806049" width="1" height="1"&gt;</content><author><name>xmonix</name><uri>http://weblogs.asp.net/members/xmonix.aspx</uri></author><category term="Personal" scheme="http://weblogs.asp.net/monikadyrda/archive/tags/Personal/default.aspx" /></entry><entry><title>WPF ImageSource</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/monikadyrda/archive/2008/12/13/wpf-imagesource.aspx" /><id>http://weblogs.asp.net/monikadyrda/archive/2008/12/13/wpf-imagesource.aspx</id><published>2008-12-13T21:18:00Z</published><updated>2008-12-13T21:18:00Z</updated><content type="html">&lt;p&gt;A little How-to put an image from embedded resources into your WPF application. I have found it very useful especially when working with ListView and creating value converters for it. &lt;/p&gt;  &lt;p&gt;My solution for this examples looks like that: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/monikadyrda/ImageSourceExampleSolution_76C147DF.jpg" mce_href="http://weblogs.asp.net/blogs/monikadyrda/ImageSourceExampleSolution_76C147DF.jpg"&gt;&lt;img src="http://weblogs.asp.net/blogs/monikadyrda/ImageSourceExampleSolution_thumb_236A01B9.jpg" title="ImageSourceExampleSolution" style="border-width: 0px; display: inline;" alt="ImageSourceExampleSolution" mce_src="http://weblogs.asp.net/blogs/monikadyrda/ImageSourceExampleSolution_thumb_236A01B9.jpg" width="244" border="0" height="187"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;1) ImageSource in XAML:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Image&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="image1"&lt;/span&gt; &lt;br&gt;&lt;span class="attr"&gt;Source&lt;/span&gt;&lt;span class="kwrd"&gt;="/ImageSourceExample;component/Assets/flower.jpg"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Where ImageSourceExample is the assembly name.&lt;/p&gt;

&lt;p&gt;2) ImageSource in c# &lt;/p&gt;

&lt;pre class="csharpcode"&gt;ImageSourceConverter imgConv = &lt;span class="kwrd"&gt;new&lt;/span&gt; ImageSourceConverter();&lt;br&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; path = &lt;span class="str"&gt;"pack://application:,,/Assets/flower.jpg"&lt;/span&gt;&lt;br&gt;ImageSource imageSource = (ImageSource) imgConv.ConvertFromString(path);&lt;br&gt;image1.Source = imageSource;&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;






.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;To read more about pack URIs in WPF look &lt;a href="http://msdn.microsoft.com/en-us/library/aa970069.aspx" mce_href="http://msdn.microsoft.com/en-us/library/aa970069.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Monika&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6782998" width="1" height="1"&gt;</content><author><name>xmonix</name><uri>http://weblogs.asp.net/members/xmonix.aspx</uri></author><category term="WPF" scheme="http://weblogs.asp.net/monikadyrda/archive/tags/WPF/default.aspx" /></entry><entry><title>Hello World!</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/monikadyrda/archive/2008/12/10/hello-world.aspx" /><id>http://weblogs.asp.net/monikadyrda/archive/2008/12/10/hello-world.aspx</id><published>2008-12-10T18:22:00Z</published><updated>2008-12-10T18:22:00Z</updated><content type="html">&lt;p mce_keep="true"&gt;As everyone can see this is my first blog post. I had some problems on startup but now I know all I need and an can start posting. I am very excited to share 'crazy WPF things I do' &lt;nobr&gt;:-)&lt;/nobr&gt;&lt;/p&gt;  &lt;p mce_keep="true"&gt;Thanks to Joe for giving me the opportunity to blog here and Krzysztof for encouraging me to start blogging.&lt;/p&gt;  &lt;p mce_keep="true"&gt;Hope I won't disappoint those guys,&lt;/p&gt;  &lt;p mce_keep="true"&gt;Monika&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6776995" width="1" height="1"&gt;</content><author><name>xmonix</name><uri>http://weblogs.asp.net/members/xmonix.aspx</uri></author><category term="Personal" scheme="http://weblogs.asp.net/monikadyrda/archive/tags/Personal/default.aspx" /></entry></feed>
