<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Monika Dyrda</title><link>http://weblogs.asp.net/monikadyrda/default.aspx</link><description>WPF Dev Girl</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Hello Caliburn – beginners guide to an amazing framework (1)</title><link>http://weblogs.asp.net/monikadyrda/archive/2009/10/26/hello-caliburn-begginners-guide-for-an-amazing-framework-1.aspx</link><pubDate>Mon, 26 Oct 2009 19:46:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7239914</guid><dc:creator>xmonix</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/monikadyrda/rsscomments.aspx?PostID=7239914</wfw:commentRss><comments>http://weblogs.asp.net/monikadyrda/archive/2009/10/26/hello-caliburn-begginners-guide-for-an-amazing-framework-1.aspx#comments</comments><description>&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;</description><category domain="http://weblogs.asp.net/monikadyrda/archive/tags/WPF/default.aspx">WPF</category><category domain="http://weblogs.asp.net/monikadyrda/archive/tags/Caliburn/default.aspx">Caliburn</category></item><item><title>WPF: ListCollectionView for sorting, filtering and grouping</title><link>http://weblogs.asp.net/monikadyrda/archive/2009/08/31/wpf-listcollectionview-for-sorting-filtering-and-grouping.aspx</link><pubDate>Mon, 31 Aug 2009 18:00:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7186641</guid><dc:creator>xmonix</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/monikadyrda/rsscomments.aspx?PostID=7186641</wfw:commentRss><comments>http://weblogs.asp.net/monikadyrda/archive/2009/08/31/wpf-listcollectionview-for-sorting-filtering-and-grouping.aspx#comments</comments><description>&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;</description><category domain="http://weblogs.asp.net/monikadyrda/archive/tags/WPF/default.aspx">WPF</category></item><item><title>Seadragon is so cool! ;-)</title><link>http://weblogs.asp.net/monikadyrda/archive/2009/08/07/seadragon-is-so-cool.aspx</link><pubDate>Fri, 07 Aug 2009 08:52:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7163342</guid><dc:creator>xmonix</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/monikadyrda/rsscomments.aspx?PostID=7163342</wfw:commentRss><comments>http://weblogs.asp.net/monikadyrda/archive/2009/08/07/seadragon-is-so-cool.aspx#comments</comments><description>
&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;</description></item><item><title>WPF TextBox validation 2</title><link>http://weblogs.asp.net/monikadyrda/archive/2009/07/28/wpf-textbox-validation-2.aspx</link><pubDate>Tue, 28 Jul 2009 17:13:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7156012</guid><dc:creator>xmonix</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/monikadyrda/rsscomments.aspx?PostID=7156012</wfw:commentRss><comments>http://weblogs.asp.net/monikadyrda/archive/2009/07/28/wpf-textbox-validation-2.aspx#comments</comments><description>&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;</description><category domain="http://weblogs.asp.net/monikadyrda/archive/tags/WPF/default.aspx">WPF</category></item><item><title>WPF ToolTip Content binding</title><link>http://weblogs.asp.net/monikadyrda/archive/2009/07/10/wpf-tooltip-content-binding.aspx</link><pubDate>Fri, 10 Jul 2009 14:19:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7144735</guid><dc:creator>xmonix</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/monikadyrda/rsscomments.aspx?PostID=7144735</wfw:commentRss><comments>http://weblogs.asp.net/monikadyrda/archive/2009/07/10/wpf-tooltip-content-binding.aspx#comments</comments><description>&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;</description></item><item><title>WPF TextBox Validation</title><link>http://weblogs.asp.net/monikadyrda/archive/2009/06/24/wpf-textbox-validation.aspx</link><pubDate>Wed, 24 Jun 2009 16:05:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7133566</guid><dc:creator>xmonix</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/monikadyrda/rsscomments.aspx?PostID=7133566</wfw:commentRss><comments>http://weblogs.asp.net/monikadyrda/archive/2009/06/24/wpf-textbox-validation.aspx#comments</comments><description>&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;</description></item><item><title>DeepZoomPix and my trip to Paris</title><link>http://weblogs.asp.net/monikadyrda/archive/2009/04/16/deepzoompix-and-my-trip-to-paris.aspx</link><pubDate>Thu, 16 Apr 2009 14:59:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7048190</guid><dc:creator>xmonix</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/monikadyrda/rsscomments.aspx?PostID=7048190</wfw:commentRss><comments>http://weblogs.asp.net/monikadyrda/archive/2009/04/16/deepzoompix-and-my-trip-to-paris.aspx#comments</comments><description>&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;</description><category domain="http://weblogs.asp.net/monikadyrda/archive/tags/DeepZoomPix/default.aspx">DeepZoomPix</category></item><item><title>Master-Detail patter implemented using WPF</title><link>http://weblogs.asp.net/monikadyrda/archive/2009/03/13/master-detail-patter-implemented-using-wpf.aspx</link><pubDate>Fri, 13 Mar 2009 14:49:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6957380</guid><dc:creator>xmonix</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/monikadyrda/rsscomments.aspx?PostID=6957380</wfw:commentRss><comments>http://weblogs.asp.net/monikadyrda/archive/2009/03/13/master-detail-patter-implemented-using-wpf.aspx#comments</comments><description>  &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;</description><category domain="http://weblogs.asp.net/monikadyrda/archive/tags/WPF/default.aspx">WPF</category></item><item><title>UX Design Patterns</title><link>http://weblogs.asp.net/monikadyrda/archive/2009/02/03/ux-design-patterns.aspx</link><pubDate>Tue, 03 Feb 2009 16:54:19 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6879011</guid><dc:creator>xmonix</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/monikadyrda/rsscomments.aspx?PostID=6879011</wfw:commentRss><comments>http://weblogs.asp.net/monikadyrda/archive/2009/02/03/ux-design-patterns.aspx#comments</comments><description>&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;</description><category domain="http://weblogs.asp.net/monikadyrda/archive/tags/UX/default.aspx">UX</category></item><item><title>WPF Binding ItemsSource to Enum</title><link>http://weblogs.asp.net/monikadyrda/archive/2009/01/08/wpf-binding-itemssource-to-enum.aspx</link><pubDate>Thu, 08 Jan 2009 19:39:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6828156</guid><dc:creator>xmonix</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/monikadyrda/rsscomments.aspx?PostID=6828156</wfw:commentRss><comments>http://weblogs.asp.net/monikadyrda/archive/2009/01/08/wpf-binding-itemssource-to-enum.aspx#comments</comments><description>&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;</description><category domain="http://weblogs.asp.net/monikadyrda/archive/tags/WPF/default.aspx">WPF</category></item><item><title>WPF Control content with curly braces</title><link>http://weblogs.asp.net/monikadyrda/archive/2009/01/07/wpf-control-content-with-curly-braces.aspx</link><pubDate>Wed, 07 Jan 2009 19:01:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6824022</guid><dc:creator>xmonix</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/monikadyrda/rsscomments.aspx?PostID=6824022</wfw:commentRss><comments>http://weblogs.asp.net/monikadyrda/archive/2009/01/07/wpf-control-content-with-curly-braces.aspx#comments</comments><description>
&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;</description><category domain="http://weblogs.asp.net/monikadyrda/archive/tags/WPF/default.aspx">WPF</category></item><item><title>Merry Christmas!</title><link>http://weblogs.asp.net/monikadyrda/archive/2008/12/24/merry-christmas.aspx</link><pubDate>Wed, 24 Dec 2008 13:22:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6806049</guid><dc:creator>xmonix</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/monikadyrda/rsscomments.aspx?PostID=6806049</wfw:commentRss><comments>http://weblogs.asp.net/monikadyrda/archive/2008/12/24/merry-christmas.aspx#comments</comments><description>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;</description><category domain="http://weblogs.asp.net/monikadyrda/archive/tags/Personal/default.aspx">Personal</category></item><item><title>WPF ImageSource</title><link>http://weblogs.asp.net/monikadyrda/archive/2008/12/13/wpf-imagesource.aspx</link><pubDate>Sat, 13 Dec 2008 21:18:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6782998</guid><dc:creator>xmonix</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/monikadyrda/rsscomments.aspx?PostID=6782998</wfw:commentRss><comments>http://weblogs.asp.net/monikadyrda/archive/2008/12/13/wpf-imagesource.aspx#comments</comments><description>&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;</description><category domain="http://weblogs.asp.net/monikadyrda/archive/tags/WPF/default.aspx">WPF</category></item><item><title>Hello World!</title><link>http://weblogs.asp.net/monikadyrda/archive/2008/12/10/hello-world.aspx</link><pubDate>Wed, 10 Dec 2008 18:22:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6776995</guid><dc:creator>xmonix</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/monikadyrda/rsscomments.aspx?PostID=6776995</wfw:commentRss><comments>http://weblogs.asp.net/monikadyrda/archive/2008/12/10/hello-world.aspx#comments</comments><description>&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;</description><category domain="http://weblogs.asp.net/monikadyrda/archive/tags/Personal/default.aspx">Personal</category></item></channel></rss>