<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="/rss.xsl"?><rss version="2.0"><channel><title>wpfconverters Wiki &amp; Documentation Rss Feed</title><link>http://www.codeplex.com/wpfconverters/Wiki/View.aspx?title=Home</link><description>wpfconverters Wiki Rss Description</description><item><title>Updated Wiki: Documentation</title><link>http://wpfconverters.codeplex.com/documentation?version=1</link><description>&lt;div class="wikidoc"&gt;Please download the latest documentation from the &lt;a href="http://wpfconverters.codeplex.com/releases/"&gt;Downloads&lt;/a&gt; section.&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>kentcb</author><pubDate>Sun, 15 Apr 2012 07:35:56 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Documentation 20120415073556A</guid></item><item><title>Updated Wiki: Home</title><link>http://wpfconverters.codeplex.com/wikipage?version=13</link><description>&lt;div class="wikidoc"&gt;&lt;h3&gt;What?&lt;/h3&gt;This project contains a set of generic binding converters that can be used in most any WPF (or Silverlight) application.
&lt;h3&gt;Why?&lt;/h3&gt;Just about every non-trivial WPF application requires some custom binding converters. A set of dependable, general-purpose converters greatly reduces the number of converters that you must write yourself.
&lt;h3&gt;Where?&lt;/h3&gt;Documentation, binaries, and source for WPF Converters can be downloaded from the &lt;a href="http://wpfconverters.codeplex.com/Release/ProjectReleases.aspx"&gt;releases&lt;/a&gt; section. WPF Converters is also available via &lt;a href="http://nuget.org/List/Packages/Kent.Boogaart.Converters"&gt;NuGet&lt;/a&gt;.
&lt;h3&gt;How?&lt;/h3&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;nameTextBox&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;Your name in upper case is &lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt; &lt;span style="color:Red;"&gt;Text&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{Binding Text, ElementName=amountTextBox, Converter={con:CaseConverter Upper}}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;Please download the &lt;a href="http://wpfconverters.codeplex.com/Release/ProjectReleases.aspx"&gt;documentation&lt;/a&gt; for detailed explanations of every converter, along with examples of use. The source code download also includes sample projects for both WPF and Silverlight.
&lt;h3&gt;Who?&lt;/h3&gt;WPF Converters is currently developed solely by &lt;a href="http://kentb.blogspot.com"&gt;Kent Boogaart&lt;/a&gt;.
&lt;h3&gt;Primary Features&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;WPF 3.5 and 4.0 support&lt;/li&gt;
&lt;li&gt;Silverlight 4.0 and 5.0 support&lt;/li&gt;
&lt;li&gt;Extensively unit tested&lt;/li&gt;
&lt;li&gt;Many converters including &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt;, which allows arbitrary C# expressions to be applied to bound values, and &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt;, which maps input values to corresponding outputs.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>kentcb</author><pubDate>Fri, 13 Apr 2012 07:40:56 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20120413074056A</guid></item><item><title>Updated Wiki: Home</title><link>http://wpfconverters.codeplex.com/wikipage?version=12</link><description>&lt;div class="wikidoc"&gt;&lt;h3&gt;What?&lt;/h3&gt;This project contains a set of generic binding converters that can be used in most any WPF (or Silverlight) application.
&lt;h3&gt;Why?&lt;/h3&gt;Just about every non-trivial WPF application requires some custom binding converters. A set of dependable, general-purpose converters greatly reduces the number of converters that you must write yourself.
&lt;h3&gt;Where?&lt;/h3&gt;Documentation, binaries, and source for WPF Converters can be downloaded from the &lt;a href="http://wpfconverters.codeplex.com/Release/ProjectReleases.aspx" class="externalLink"&gt;releases&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; section. WPF Converters is also available via &lt;a href="http://nuget.org/List/Packages/Kent.Boogaart.Converters" class="externalLink"&gt;NuGet&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.
&lt;h3&gt;How?&lt;/h3&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;nameTextBox&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;Your name in upper case is &lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt; &lt;span style="color:Red;"&gt;Text&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{Binding Text, ElementName=amountTextBox, Converter={con:CaseConverter Upper}}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;Please download the &lt;a href="http://wpfconverters.codeplex.com/Release/ProjectReleases.aspx" class="externalLink"&gt;documentation&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for detailed explanations of every converter, along with examples of use. The source code download also includes sample projects for both WPF and Silverlight.
&lt;h3&gt;Who?&lt;/h3&gt;WPF Converters is currently developed solely by &lt;a href="http://kentb.blogspot.com" class="externalLink"&gt;Kent Boogaart&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.
&lt;h3&gt;Primary Features&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;WPF 3.5 and 4.0 support&lt;/li&gt;
&lt;li&gt;Silverlight support&lt;/li&gt;
&lt;li&gt;Extensively unit tested&lt;/li&gt;
&lt;li&gt;Many converters including &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt;, which allows arbitrary C# expressions to be applied to bound values, and &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt;, which maps input values to corresponding outputs.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>kentcb</author><pubDate>Wed, 21 Sep 2011 15:43:19 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20110921034319P</guid></item><item><title>Updated Wiki: Home</title><link>http://wpfconverters.codeplex.com/wikipage?version=11</link><description>&lt;div class="wikidoc"&gt;&lt;h3&gt;What?&lt;/h3&gt;This project contains a set of generic binding converters that can be used in most any WPF (or Silverlight) application.
&lt;h3&gt;Why?&lt;/h3&gt;Just about every non-trivial WPF application requires some custom binding converters. A set of dependable, general-purpose converters greatly reduces the number of converters that you must write yourself.
&lt;h3&gt;Where?&lt;/h3&gt;Documentation, binaries, and source for WPF Converters can be downloaded from the &lt;a href="http://wpfconverters.codeplex.com/Release/ProjectReleases.aspx" class="externalLink"&gt;releases&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; section. WPF Converters is also available via &lt;a href="http://nuget.org/List/Packages/Kent.Boogaart.Converters" class="externalLink"&gt;NuGet&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.
&lt;h3&gt;How?&lt;/h3&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;nameTextBox&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;Your name in upper case is &lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt; &lt;span style="color:Red;"&gt;Text&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{Binding Text, ElementName=amountTextBox, Converter={con:CaseConverter Upper}}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;Please download the &lt;a href="http://wpfconverters.codeplex.com/Release/ProjectReleases.aspx" class="externalLink"&gt;documentation&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for detailed explanations of every converter, along with examples of use. The source code download also includes sample projects for both WPF and Silverlight.
&lt;h3&gt;Who?&lt;/h3&gt;WPF Converters is currently developed solely by &lt;a href="http://kentb.blogspot.com" class="externalLink"&gt;Kent Boogaart&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.
&lt;h3&gt;Primary Features&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;WPF 3.5 and 4.0 support&lt;/li&gt;
&lt;li&gt;Silverlight support&lt;/li&gt;
&lt;li&gt;Extensively unit tested&lt;/li&gt;
&lt;li&gt;Many converters including &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt;, which allows arbitrary C# expressions to be applied to bound values, and &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt;, which maps input values corresponding outputs.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>kentcb</author><pubDate>Mon, 05 Sep 2011 19:21:16 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20110905072116P</guid></item><item><title>Updated Wiki: Home</title><link>http://wpfconverters.codeplex.com/wikipage?version=10</link><description>&lt;div class="wikidoc"&gt;&lt;h3&gt;What?&lt;/h3&gt;This project contains a set of generic binding converters that can be used in most any WPF (or Silverlight) application.
&lt;h3&gt;Why?&lt;/h3&gt;Just about every non-trivial WPF application requires some custom binding converters. A set of dependable, general-purpose converters greatly reduces the number of converters that you must write yourself.
&lt;h3&gt;Where?&lt;/h3&gt;Documentation, binaries, and source for WPF Converters can be downloaded from the &lt;a href="http://wpfconverters.codeplex.com/Release/ProjectReleases.aspx" class="externalLink"&gt;releases&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; section. Also available via &lt;a href="http://nuget.org/List/Packages/Kent.Boogaart.Converters" class="externalLink"&gt;NuGet&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.
&lt;h3&gt;How?&lt;/h3&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;nameTextBox&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;Your name in upper case is &lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt; &lt;span style="color:Red;"&gt;Text&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{Binding Text, ElementName=amountTextBox, Converter={con:CaseConverter Upper}}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;Please download the &lt;a href="http://wpfconverters.codeplex.com/Release/ProjectReleases.aspx" class="externalLink"&gt;documentation&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for detailed explanations of every converter, along with examples of use. The source code download also includes sample projects for both WPF and Silverlight.
&lt;h3&gt;Who?&lt;/h3&gt;WPF Converters is currently developed solely by &lt;a href="http://kentb.blogspot.com" class="externalLink"&gt;Kent Boogaart&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.
&lt;h3&gt;Primary Features&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;WPF 3.5 and 4.0 support&lt;/li&gt;
&lt;li&gt;Silverlight support&lt;/li&gt;
&lt;li&gt;Extensively unit tested&lt;/li&gt;
&lt;li&gt;Many converters including &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt;, which allows arbitrary C# expressions to be applied to bound values, and &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt;, which maps input values corresponding outputs.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>kentcb</author><pubDate>Mon, 05 Sep 2011 19:18:53 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20110905071853P</guid></item><item><title>Updated Wiki: Home</title><link>http://wpfconverters.codeplex.com/wikipage?version=9</link><description>&lt;div class="wikidoc"&gt;&lt;h3&gt;What?&lt;/h3&gt;This project contains a set of generic binding converters that can be used in most any WPF (or Silverlight) application.
&lt;h3&gt;Why?&lt;/h3&gt;Just about every non-trivial WPF application requires some custom binding converters. A set of dependable, general-purpose converters greatly reduces the number of converters that you must write yourself.
&lt;h3&gt;Where?&lt;/h3&gt;Documentation, binaries, and source for WPF Converters can be downloaded from the &lt;a href="http://wpfconverters.codeplex.com/Release/ProjectReleases.aspx" class="externalLink"&gt;releases&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; section.
&lt;h3&gt;How?&lt;/h3&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;nameTextBox&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;Your name in upper case is &lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt; &lt;span style="color:Red;"&gt;Text&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{Binding Text, ElementName=amountTextBox, Converter={con:CaseConverter Upper}}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;Please download the &lt;a href="http://wpfconverters.codeplex.com/Release/ProjectReleases.aspx" class="externalLink"&gt;documentation&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for detailed explanations of every converter, along with examples of use. The source code download also includes sample projects for both WPF and Silverlight.
&lt;h3&gt;Who?&lt;/h3&gt;WPF Converters is currently developed solely by &lt;a href="http://kentb.blogspot.com" class="externalLink"&gt;Kent Boogaart&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.
&lt;h3&gt;Primary Features&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;WPF 3.5 and 4.0 support&lt;/li&gt;
&lt;li&gt;Silverlight support&lt;/li&gt;
&lt;li&gt;Extensively unit tested&lt;/li&gt;
&lt;li&gt;Many converters including &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt;, which allows arbitrary C# expressions to be applied to bound values, and &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt;, which maps input values corresponding outputs.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>kentcb</author><pubDate>Fri, 02 Sep 2011 20:21:46 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20110902082146P</guid></item><item><title>Updated Wiki: Home</title><link>http://wpfconverters.codeplex.com/wikipage?version=8</link><description>&lt;div class="wikidoc"&gt;&lt;h3&gt;What?&lt;/h3&gt;This project contains a set of generic binding converters that can be used in most any WPF (or Silverlight) application.
&lt;h3&gt;Why?&lt;/h3&gt;Just about every non-trivial WPF application requires some custom binding converters. A set of dependable, general-purpose converters greatly reduces the number of converters that you must write yourself.
&lt;h3&gt;Where?&lt;/h3&gt;Documentation, binaries, and source for WPF Converters can be downloaded from the &lt;a href="http://wpfconverters.codeplex.com/Release/ProjectReleases.aspx" class="externalLink"&gt;releases&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; section.
&lt;h3&gt;How?&lt;/h3&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;nameTextBox&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;Your name in upper case is &lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt; &lt;span style="color:Red;"&gt;Text&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{Binding Text, ElementName=amountTextBox, Converter={con:CaseConverter Upper}}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;Please download the &lt;a href="http://wpfconverters.codeplex.com/Release/ProjectReleases.aspx" class="externalLink"&gt;documentation&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for detailed explanations of every converter, along with examples of use. The source code download also includes sample projects for both WPF and Silverlight.
&lt;h3&gt;Who?&lt;/h3&gt;WPF Converters is currently developed solely by &lt;a href="http://kentb.blogspot.com" class="externalLink"&gt;Kent Boogaart&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.
&lt;h3&gt;Primary Features&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;WPF 3.5, and 4.0 support&lt;/li&gt;
&lt;li&gt;Silverlight support&lt;/li&gt;
&lt;li&gt;Extensively unit tested&lt;/li&gt;
&lt;li&gt;Many converters including &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt;, which allows arbitrary C# expressions to be applied to bound values, and &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt;, which maps input values corresponding outputs.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>kentcb</author><pubDate>Fri, 02 Sep 2011 20:21:37 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20110902082137P</guid></item><item><title>Updated Wiki: Home</title><link>http://wpfconverters.codeplex.com/wikipage?version=7</link><description>&lt;div class="wikidoc"&gt;&lt;h3&gt;What?&lt;/h3&gt;This project contains a set of generic binding converters that can be used in most any WPF (or Silverlight) application.
&lt;h3&gt;Why?&lt;/h3&gt;Just about every non-trivial WPF application requires some custom binding converters. A set of dependable, general-purpose converters greatly reduces the number of converters that you must write yourself.
&lt;h3&gt;Where?&lt;/h3&gt;Documentation, binaries, and source for WPF Converters can be downloaded from the &lt;a href="http://wpfconverters.codeplex.com/Release/ProjectReleases.aspx" class="externalLink"&gt;releases&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; section.
&lt;h3&gt;How?&lt;/h3&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;nameTextBox&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;Your name in upper case is &lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt; &lt;span style="color:Red;"&gt;Text&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{Binding Text, ElementName=amountTextBox, Converter={con:CaseConverter Upper}}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;Please download the &lt;a href="http://wpfconverters.codeplex.com/Release/ProjectReleases.aspx" class="externalLink"&gt;documentation&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for detailed explanations of every converter, along with examples of use. The source code download also includes sample projects for both WPF and Silverlight.
&lt;h3&gt;Who?&lt;/h3&gt;WPF Converters is currently developed solely by &lt;a href="http://kentb.blogspot.com" class="externalLink"&gt;Kent Boogaart&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.
&lt;h3&gt;Primary Features&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;WPF 3.0, 3.5, and 4.0 support&lt;/li&gt;
&lt;li&gt;Silverlight support&lt;/li&gt;
&lt;li&gt;Extensively unit tested&lt;/li&gt;
&lt;li&gt;Many converters including &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt;, which allows arbitrary C# expressions to be applied to bound values, and &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt;, which maps input values corresponding outputs.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>kentcb</author><pubDate>Fri, 02 Sep 2011 20:17:51 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20110902081751P</guid></item><item><title>Updated Wiki: Home</title><link>http://wpfconverters.codeplex.com/wikipage?version=6</link><description>&lt;div class="wikidoc"&gt;&lt;h3&gt;What?&lt;/h3&gt;This project contains a set of generic binding converters that can be used in most any WPF (or Silverlight) application.
&lt;h3&gt;Why?&lt;/h3&gt;Just about every non-trivial WPF application requires some custom binding converters. A set of dependable, general-purpose converters greatly reduces the number of converters that you must write yourself.
&lt;h3&gt;Where?&lt;/h3&gt;Documentation, binaries, and source for WPF Converters can be downloaded from the &lt;a href="http://wpfconverters.codeplex.com/Release/ProjectReleases.aspx" class="externalLink"&gt;releases&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; section.
&lt;h3&gt;How?&lt;/h3&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;nameTextBox&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;Your name in upper case is &lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt; &lt;span style="color:Red;"&gt;Text&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{Binding Text, ElementName=amountTextBox, Converter={con:CaseConverter Upper}}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;Please download the &lt;a href="http://wpfconverters.codeplex.com/Release/ProjectReleases.aspx" class="externalLink"&gt;documentation&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for detailed explanations of every converter, along with examples of use.
&lt;h3&gt;Who?&lt;/h3&gt;WPF Converters is currently developed solely by &lt;a href="http://kentb.blogspot.com" class="externalLink"&gt;Kent Boogaart&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.
&lt;h3&gt;Primary Features&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;WPF 3.0, 3.5, and 4.0 support&lt;/li&gt;
&lt;li&gt;Silverlight support&lt;/li&gt;
&lt;li&gt;Extensively unit tested&lt;/li&gt;
&lt;li&gt;Many converters including &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt;, which allows arbitrary C# expressions to be applied to bound values, and &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt;, which maps input values corresponding outputs.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>kentcb</author><pubDate>Fri, 02 Sep 2011 20:17:19 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20110902081719P</guid></item><item><title>Updated Wiki: Home</title><link>http://wpfconverters.codeplex.com/wikipage?version=5</link><description>&lt;div class="wikidoc"&gt;&lt;h3&gt;What?&lt;/h3&gt;This project contains a set of generic binding converters that can be used in most any WPF (or Silverlight) application.
&lt;h3&gt;Why?&lt;/h3&gt;Just about every non-trivial WPF application requires some custom binding converters. A set of dependable, general-purpose converters greatly reduces the number of converters that you must write yourself.
&lt;h3&gt;Where?&lt;/h3&gt;Documentation, binaries, and source for WPF Converters can be downloaded from the &lt;a href="http://wpfconverters.codeplex.com/Release/ProjectReleases.aspx" class="externalLink"&gt;releases&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; section.
&lt;h3&gt;How?&lt;/h3&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;nameTextBox&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;Your name in upper case is &lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Run&lt;/span&gt; &lt;span style="color:Red;"&gt;Text&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{Binding Text, ElementName=amountTextBox, Converter={con:CaseConverter Upper}}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;Please download the &lt;a href="http://wpfconverters.codeplex.com/Release/ProjectReleases.aspx" class="externalLink"&gt;documentation&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; for detailed explanations of every converter, along with examples of usage.
&lt;h3&gt;Who?&lt;/h3&gt;WPF Converters is currently developed solely by &lt;a href="http://kentb.blogspot.com" class="externalLink"&gt;Kent Boogaart&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.
&lt;h3&gt;Primary Features&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;WPF 3.0, 3.5, and 4.0 support&lt;/li&gt;
&lt;li&gt;Silverlight support&lt;/li&gt;
&lt;li&gt;Extensively unit tested&lt;/li&gt;
&lt;li&gt;Many converters including &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt;, which allows arbitrary C# expressions to be applied to bound values, and &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt;, which maps input values corresponding outputs.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>kentcb</author><pubDate>Fri, 02 Sep 2011 20:17:03 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20110902081703P</guid></item><item><title>New Comment on "User Documentation"</title><link>http://wpfconverters.codeplex.com/wikipage?title=User Documentation&amp;ANCHOR#C16304</link><description>Can&amp;#39;t you derive from Freezable instead of DependencyObject&amp;#63;  I think that should solve the error you describe....</description><author>ksubramani</author><pubDate>Fri, 09 Jul 2010 19:45:18 GMT</pubDate><guid isPermaLink="false">New Comment on "User Documentation" 20100709074518P</guid></item><item><title>Updated Wiki: User Documentation</title><link>http://wpfconverters.codeplex.com/wikipage?title=User Documentation&amp;version=6</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;User Documentation&lt;/h1&gt;&lt;h2&gt;Contents&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="#Overview"&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#SetUp"&gt;Set Up&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#Converters"&gt;Converters&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="#CaseConverter"&gt;CaseConverter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#FormatConverter"&gt;FormatConverter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#DateTimeConverter"&gt;DateTimeConverter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#MapConverter"&gt;MapConverter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ExpressionConverter"&gt;ExpressionConverter&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="#AWord"&gt;A Word on the ExpressionConverter&amp;#8217;s Parser&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ConverterGroup"&gt;ConverterGroup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#MultiConverterGroup"&gt;MultiConverterGroup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#TypeConverter"&gt;TypeConverter&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#DataBindingAndConverters"&gt;Data Binding and Converters&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;a name="Overview"&gt;&lt;/a&gt;
&lt;h1&gt;Overview&lt;/h1&gt;WPF’s &lt;span class="codeInline"&gt;Binding&lt;/span&gt; and &lt;span class="codeInline"&gt;MultiBinding&lt;/span&gt; types define a &lt;span class="codeInline"&gt;Converter&lt;/span&gt; property that allows you to provide a converter that will be used during the binding process. If you don’t explicitly specify a value converter, WPF will use its built-in primitive ones behind the scenes (such as &lt;span class="codeInline"&gt;DefaultValueConverter&lt;/span&gt;, &lt;span class="codeInline"&gt;ObjectTargetConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;SystemConvertConverter&lt;/span&gt; – all are &lt;span class="codeInline"&gt;internal&lt;/span&gt; types defined in the &lt;span class="codeInline"&gt;MS.Internal.Data&lt;/span&gt; namespace).&lt;br /&gt;&lt;br /&gt;If you &lt;i&gt;do&lt;/i&gt; specify a value converter, WPF will invoke methods on your converter during the data binding process. These methods are:
&lt;ul&gt;&lt;li&gt;&lt;span class="codeInline"&gt;Convert()&lt;/span&gt;. Called to convert a value when propagating it from the binding source to the binding target.&lt;/li&gt;
&lt;li&gt;&lt;span class="codeInline"&gt;ConvertBack()&lt;/span&gt;. Called to convert a value when propagating it from the binding target to the binding source.&lt;/li&gt;&lt;/ul&gt;
The following diagram depicts this process:&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=wpfconverters&amp;DownloadId=25506" alt="Binding.png" title="Binding.png" /&gt;&lt;br /&gt;What I have found whilst working with WPF is that value converters (shown in the middle of the above diagram) are often needed to solve similar problems. This article and code library seeks to address the most common converter requirements and alleviate the need for a lot of custom converter code in any WPF application.&lt;br /&gt;&lt;br /&gt;The following converters are included in this project:&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt; Name &lt;/th&gt;&lt;th&gt; Supports Singular Conversions &lt;/th&gt;&lt;th&gt; Supports Multiple Conversions &lt;/th&gt;&lt;th&gt; Supports Forward Conversions &lt;/th&gt;&lt;th&gt; Supports Backward Conversions &lt;/th&gt;&lt;th&gt; Has Markup Extension &lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#CaseConverter"&gt;CaseConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#ConverterGroup"&gt;ConverterGroup&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes (1) &lt;/td&gt;&lt;td&gt; Yes (2) &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#DateTimeConverter"&gt;DateTimeConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#ExpressionConverter"&gt;ExpressionConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes (3) &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#FormatConverter"&gt;FormatConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes (4) &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#MapConverter"&gt;MapConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#MultiConverterGroup"&gt;MultiConverterGroup&lt;/a&gt; &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes (5) &lt;/td&gt;&lt;td&gt; Yes (6) &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#TypeConverter"&gt;TypeConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;ol&gt;&lt;li&gt;Assuming all child converters support forward conversions.&lt;/li&gt;
&lt;li&gt;Assuming all child converters support backward conversions.&lt;/li&gt;
&lt;li&gt;In fact, this is the only way to use the expression converter.&lt;/li&gt;
&lt;li&gt;Only for singular conversions.&lt;/li&gt;
&lt;li&gt;Assuming all child converters support forward conversions.&lt;/li&gt;
&lt;li&gt;Assuming all child converters support backward conversions.&lt;/li&gt;&lt;/ol&gt;
&lt;a name="UsingWPFConverters"&gt;&lt;/a&gt;
&lt;h1&gt;Using WPF Converters&lt;/h1&gt;To use WPF Converters, you need to:
&lt;ol&gt;&lt;li&gt;Add a reference to the &lt;i&gt;Kent.Boogaart.Converters.dll&lt;/i&gt; assembly.&lt;/li&gt;
&lt;li&gt;Declare an XML-&amp;gt;CLR namespace mapping to &lt;i&gt;http://schemas.kent.boogaart.com/converters&lt;/i&gt;.&lt;/li&gt;&lt;/ol&gt;
&lt;br /&gt;All the examples on this page assume a declaration such as:&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Window&lt;/span&gt; &lt;span style="color:Red;"&gt;xmlns:con&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;http://schemas.kent.boogaart.com/converters&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;a name="Converters"&gt;&lt;/a&gt;
&lt;h1&gt;Converters&lt;/h1&gt;In this section, each of the converters will be discussed in some detail. Note that there are further usage examples available in the API documentation.&lt;br /&gt;&lt;a name="CaseConverter"&gt;&lt;/a&gt;
&lt;h2&gt;CaseConverter&lt;/h2&gt;The &lt;span class="codeInline"&gt;CaseConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;CaseConverterExtension&lt;/span&gt; classes allow you to convert a &lt;span class="codeInline"&gt;string&lt;/span&gt; to upper or lower case. They accept a single parameter: &lt;span class="codeInline"&gt;Casing&lt;/span&gt;, which is used to specify the desired case for the resultant &lt;span class="codeInline"&gt;string&lt;/span&gt;. It is very simple to use, as the following example demonstrates:&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_textBox&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt; &lt;span style="color:Red;"&gt;Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{Binding Text, ElementName=_textBox, Converter={con:CaseConverter Upper}}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt; &lt;span style="color:Red;"&gt;Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{Binding Text, ElementName=_textBox, Converter={con:CaseConverter Lower}}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;Anything typed in the &lt;span class="codeInline"&gt;TextBox&lt;/span&gt; will be displayed in uppercase in the first &lt;span class="codeInline"&gt;Label&lt;/span&gt;, and lowercase in the second.&lt;br /&gt;&lt;a name="FormatConverter"&gt;&lt;/a&gt;
&lt;h2&gt;FormatConverter&lt;/h2&gt;The &lt;span class="codeInline"&gt;FormatConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;FormatConverterExtension&lt;/span&gt; classes allow you to convert any number of &lt;span class="codeInline"&gt;object&lt;/span&gt;s to a &lt;span class="codeInline"&gt;string&lt;/span&gt; by using .NET’s standard formatting capabilities. They accept a single parameter: &lt;span class="codeInline"&gt;FormatString&lt;/span&gt;, which defines the format for the resultant &lt;span class="codeInline"&gt;string&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;When binding to a single value it can be used as follows:&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_textBox&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt; &lt;span style="color:Red;"&gt;Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{Binding Text, ElementName=_textBox, Converter={con:FormatConverter {}Your name is {0}}}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;Note how the format &lt;span class="codeInline"&gt;string&lt;/span&gt; passed to the &lt;span class="codeInline"&gt;FormatConverter&lt;/span&gt; is escaped with &amp;quot;{}&amp;quot;, which is necessary because it contains curly brace characters within it. The format &lt;span class="codeInline"&gt;string&lt;/span&gt; on its own is simply &amp;quot;Your name is {0}&amp;quot;.&lt;br /&gt;&lt;br /&gt;Binding to multiple values looks like this:&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_textBox1&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_textBox2&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label.Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiBinding&lt;/span&gt; &lt;span style="color:Red;"&gt;Converter&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{con:FormatConverter {}You said {0} and {1}.}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt; &lt;span style="color:Red;"&gt;Path&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Text&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;ElementName&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_textBox1&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt; &lt;span style="color:Red;"&gt;Path&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Text&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;ElementName&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_textBox2&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiBinding&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label.Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;a name="DateTimeConverter"&gt;&lt;/a&gt;
&lt;h2&gt;DateTimeConverter&lt;/h2&gt;The &lt;span class="codeInline"&gt;DateTimeConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;DateTimeConverterExtension&lt;/span&gt; classes allow you to perform specialized conversions on &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s during data binding. Using these classes, you can do any of the following:
&lt;ul&gt;&lt;li&gt;Convert between different kinds of &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s (e.g. convert between UTC and local time).&lt;/li&gt;
&lt;li&gt;Convert between different kinds of &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s without changing the underlying &lt;span class="codeInline"&gt;DateTime&lt;/span&gt; value (i.e. convert by using &lt;span class="codeInline"&gt;DateTime.SpecifyKind()&lt;/span&gt; instead of &lt;span class="codeInline"&gt;ToLocalTime()&lt;/span&gt; or &lt;span class="codeInline"&gt;ToUniversalTime()&lt;/span&gt;).&lt;/li&gt;
&lt;li&gt;Adjust &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s during conversion by adding a &lt;span class="codeInline"&gt;TimeSpan&lt;/span&gt; to them.&lt;/li&gt;&lt;/ul&gt;
The &lt;span class="codeInline"&gt;DateTimeConverter&lt;/span&gt; supports both forward and backwards conversions. This allows you, for example, to store &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s in UTC format in your business objects but convert them to local time prior to using them in your interface. The following example shows how you could achieve this (and assumes the existence of a WPF &lt;span class="codeInline"&gt;DatePicker&lt;/span&gt; class):&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;DatePicker&lt;/span&gt; &lt;span style="color:Red;"&gt;Value&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{Binding StartDate, Converter={con:DateTimeConverter TargetKind=Local, SourceKind=Utc}}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;a name="MapConverter"&gt;&lt;/a&gt;
&lt;h2&gt;MapConverter&lt;/h2&gt;The &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; class (which has no corresponding markup extension) can be used to map one set of values to another. This is an extremely useful converter that has many use cases. Here are some examples:
&lt;ul&gt;&lt;li&gt;Converting enumeration values to human-readable strings prior to display.&lt;/li&gt;
&lt;li&gt;Converting between &lt;span class="codeInline"&gt;bool&lt;/span&gt; values and &lt;span class="codeInline"&gt;Visibility&lt;/span&gt; enumeration values.&lt;/li&gt;
&lt;li&gt;Converting between &lt;span class="codeInline"&gt;bool&lt;/span&gt; values and an &lt;span class="codeInline"&gt;ImageSource&lt;/span&gt; so the user sees a tick or a cross depending on the &lt;span class="codeInline"&gt;bool&lt;/span&gt; value.&lt;/li&gt;&lt;/ul&gt;
The &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; works by using a collection of &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; objects. Each &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; object specifies a value to map &lt;i&gt;from&lt;/i&gt; and a value to map &lt;i&gt;to&lt;/i&gt;. The same &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; objects are used both for forward conversions and backward conversions.&lt;br /&gt;&lt;br /&gt;If no relevant &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; object can be found during a conversion, the &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; uses its &lt;span class="codeInline"&gt;FallbackBehavior&lt;/span&gt; property to decide what to do. You can tell it to either return &lt;span class="codeInline"&gt;DependencyProperty.UnsetValue&lt;/span&gt; or to return the value it was asked to convert.&lt;br /&gt;&lt;br /&gt;An example should make this all clear:&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label.Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt; &lt;span style="color:Red;"&gt;Path&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Gender&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding.Converter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
				&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MapConverter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
					&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Mapping&lt;/span&gt; &lt;span style="color:Red;"&gt;From&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{x:Static Gender.Male}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;To&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Guy&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
					&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Mapping&lt;/span&gt; &lt;span style="color:Red;"&gt;From&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{x:Static Gender.Female}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;To&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Gal&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
				&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MapConverter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding.Converter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label.Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;This example uses a &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; to convert from members in a &lt;span class="codeInline"&gt;Gender&lt;/span&gt; enumeration to either &amp;quot;Guy&amp;quot; or &amp;quot;Gal&amp;quot;. Now suppose that the &lt;span class="codeInline"&gt;Gender&lt;/span&gt; enumeration also defines a value of &lt;span class="codeInline"&gt;Unknown&lt;/span&gt; (a wise move in these modern times). The above mapping won’t successfully convert values of &lt;span class="codeInline"&gt;Unknown&lt;/span&gt; – it will just return &lt;span class="codeInline"&gt;DependencyProperty.UnsetValue&lt;/span&gt; instead.&lt;br /&gt;&lt;br /&gt;If you want unknown genders to display as &amp;quot;Unknown&amp;quot; you can either add another &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; or just tell the &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; to return the original value if it cannot map the value it is given:&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MapConverter&lt;/span&gt; &lt;span style="color:Red;"&gt;FallbackBehavior&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;ReturnOriginalValue&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Mapping&lt;/span&gt; &lt;span style="color:Red;"&gt;From&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{x:Static Gender.Male}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;To&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Guy&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Mapping&lt;/span&gt; &lt;span style="color:Red;"&gt;From&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{x:Static Gender.Female}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;To&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Gal&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MapConverter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;A &lt;span class="codeInline"&gt;FallbackBehavior&lt;/span&gt; of &lt;span class="codeInline"&gt;ReturnOriginalValue&lt;/span&gt; is extremely useful where you only want to map a subset of the total possible values.&lt;br /&gt;&lt;a name="ExpressionConverter"&gt;&lt;/a&gt;
&lt;h2&gt;ExpressionConverter&lt;/h2&gt;The &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;ExpressionConverterExtension&lt;/span&gt; classes allow you to convert one or more bound values by running them through a C#-like expression. The expression uses placeholders of the form &lt;span class="codeInline"&gt;{x&lt;/span&gt;} to demarcate bound arguments, where &lt;span class="codeInline"&gt;x&lt;/span&gt; is the argument number starting at zero.&lt;br /&gt;&lt;br /&gt;Let’s start with something simple:&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Canvas&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Slider&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_slider&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;Width&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;300&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;Minimum&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;1&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;Maximum&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;100&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Rectangle&lt;/span&gt; &lt;span style="color:Red;"&gt;Canvas.Top&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;20&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;Fill&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Red&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;Width&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;100&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;Height&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{Binding Value, ElementName=_slider}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Rectangle&lt;/span&gt; &lt;span style="color:Red;"&gt;Canvas.Top&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;100&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;Fill&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Blue&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;Width&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;100&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;Height&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{Binding Value, ElementName=_slider, Converter={con:ExpressionConverter {}{0} * 2}}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Canvas&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;In this example, the value of the &lt;span class="codeInline"&gt;Slider&lt;/span&gt; dictates the height of the first rectangle. It also dictates the height of the second rectangle, but an &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; is used to double the value first.&lt;br /&gt;&lt;br /&gt;Notice how the expression passed to the &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; is escaped with &amp;quot;{}&amp;quot;. As with the FormatConverter, this is necessary because it includes curly brace characters. The expression on its own is simply &lt;span class="codeInline"&gt;&amp;quot;{0} * 2&amp;quot;&lt;/span&gt;. In English, this means &amp;quot;multiply the first argument by two&amp;quot;.&lt;br /&gt;&lt;br /&gt;Now, let’s do something a little more complex:&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;StackPanel&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_panel&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;What bands do you like?&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;CheckBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_rammstein&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;Rammstein&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;CheckBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_powderfinger&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;Powderfinger&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;CheckBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_nickelback&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;Nickelback&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;CheckBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_ministry&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;Ministry&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Button&lt;/span&gt; &lt;span style="color:Red;"&gt;Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Let me in!&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Button.IsEnabled&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiBinding&lt;/span&gt; &lt;span style="color:Red;"&gt;Converter&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{ExpressionConverter {}{0} &amp;amp;amp;&amp;amp;amp; {1} &amp;amp;amp;&amp;amp;amp; {3} &amp;amp;amp;&amp;amp;amp; !{2}}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
				&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt; &lt;span style="color:Red;"&gt;Path&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;IsChecked&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;ElementName&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_rammstein&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
				&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt; &lt;span style="color:Red;"&gt;Path&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;IsChecked&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;ElementName&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_powderfinger&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
				&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt; &lt;span style="color:Red;"&gt;Path&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;IsChecked&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;ElementName&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_nickelback&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
				&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt; &lt;span style="color:Red;"&gt;Path&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;IsChecked&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;ElementName&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_ministry&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiBinding&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Button.IsEnabled&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Button&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;In this example, the entry button is only enabled if the correct combination of bands is chosen. If you don’t like one of the good bands or if you &lt;i&gt;do&lt;/i&gt; like the sucky band, you won’t be allowed in.&lt;br /&gt;&lt;br /&gt;The actual expression has again been escaped due to its presence in XAML. Unescaped, it is simply &lt;span class="codeInline"&gt;&amp;quot;{0} &amp;amp;&amp;amp; {1} &amp;amp;&amp;amp; {3} &amp;amp;&amp;amp; !{2}&amp;quot;&lt;/span&gt;. An alternative approach that avoids all this escaping is to use a more long-winded syntax in the &lt;span class="codeInline"&gt;MultiBinding&lt;/span&gt; as follows:&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiBinding&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiBinding.Converter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;ExpressionConverterExtension&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;ExpressionConverterExtension.Expression&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
				&lt;span style="color:Blue;"&gt;&amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color:Gray;"&gt;
				{0} &amp;amp;&amp;amp; {1} &amp;amp;&amp;amp; {3} &amp;amp;&amp;amp; !{2}
				&lt;/span&gt;&lt;span style="color:Blue;"&gt;]]&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;ExpressionConverterExtension.Expression&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;ExpressionConverterExtension&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiBinding.Converter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiBinding&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;The &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; supports a lot of C# operators and we’ve only scratched the surface of the possibilities here. Please see the API documentation for a full list of supported operators.&lt;br /&gt;&lt;a name="AWord"&gt;&lt;/a&gt;
&lt;h3&gt;A Word on the ExpressionConverter’s Parser&lt;/h3&gt;I am not going to go into detail here on the implementation of the parser behind the &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt;. For a good overview on writing a code parser, you should check out &lt;a href="http://Tommy Carlier’s series" class="externalLink"&gt;http://tommycarlier.blogspot.com/2007/05/writing-parser-overview.html&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; or any good book on compiler construction. However, I would like to point out a few things.&lt;br /&gt;&lt;br /&gt;Firstly, I did not leverage .NET’s C# CodeDom implementation to parse the expressions. This was due to the imposed security restrictions. I want the &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; to be usable in low trust applications (including Silverlight).&lt;br /&gt;&lt;br /&gt;Secondly, I did not leverage ANTLR to generate the parser because then my library would have a dependency of the .NET ANTLR runtime. This was not an option as I was trying to keep the overhead of my library to a minimum. Of course, I did experiment with both CodeDom and ANTLR prior to implementing the parser. This gave me some insights and helped me formulate goals for the parser. Some things that are not supported by my implementation are:
&lt;ul&gt;&lt;li&gt;Verbatim &lt;span class="codeInline"&gt;string&lt;/span&gt;s (i.e. strings starting with &lt;span class="codeInline"&gt;@&lt;/span&gt;).&lt;/li&gt;
&lt;li&gt;Hexadecimal or Unicode escape sequences in &lt;span class="codeInline"&gt;string&lt;/span&gt;s (but common escape sequences such as &lt;span class="codeInline"&gt;\n&lt;/span&gt; and &lt;span class="codeInline"&gt;\t&lt;/span&gt; are supported).&lt;/li&gt;
&lt;li&gt;Property accessors (e.g. an expression such as &lt;span class="codeInline"&gt;&amp;quot;{0}.Age &amp;gt; 18&amp;quot;&lt;/span&gt; will not work).&lt;/li&gt;
&lt;li&gt;Array indexers (e.g. an expression such as &lt;span class="codeInline"&gt;&amp;quot;{0}[0] &amp;gt; {0}[1]&amp;quot;&lt;/span&gt; will not work).&lt;/li&gt;
&lt;li&gt;Branching statements (and in particular, no ternary operator).&lt;/li&gt;&lt;/ul&gt;
These features were left out consciously: either because of space constraints, concerns about abuse, or concerns about the efficiency of an interpretive implementation. If you feel there is good reason to include some of these features then please let me know. If you make a strong case I may well add your feature of choice.&lt;br /&gt;&lt;br /&gt;Finally, as I hinted at above, the current implementation of the parser functions as an interpreter. It does not yet leverage .NET’s &lt;span class="codeInline"&gt;DynamicMethod&lt;/span&gt; class to produce compiled output, but it may in the future . Note that expressions given to the &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; are parsed only once. After being parsed, the same abstract syntax tree (AST) is used to evaluate the expression any number of times. Having said that, evaluation of the expressions will be slower than an otherwise equivalent implementation based on &lt;span class="codeInline"&gt;DynamicMethod&lt;/span&gt;. If this proves to be a problem in the real world then I may change the implementation.&lt;br /&gt;&lt;a name="ConverterGroup"&gt;&lt;/a&gt;
&lt;h2&gt;ConverterGroup&lt;/h2&gt;The &lt;span class="codeInline"&gt;Binding&lt;/span&gt; class only allows you to provide one converter. The &lt;span class="codeInline"&gt;ConverterGroup&lt;/span&gt; class allows you to construct a pipeline of converters that can be assigned to a &lt;span class="codeInline"&gt;Binding&lt;/span&gt;, which essentially annuls this restriction. Here’s an example:&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_textBox&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label.Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt; &lt;span style="color:Red;"&gt;Path&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Text&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;ElementName&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_textBox&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding.Converter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
				&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;ConverterGroup&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
					&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;CaseConverter&lt;/span&gt; &lt;span style="color:Red;"&gt;Casing&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Upper&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
					&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;FormatConverter&lt;/span&gt; &lt;span style="color:Red;"&gt;FormatString&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;In uppercase, you entered ‘{0}’.&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
				&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;ConverterGroup&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding.Converter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label.Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;In this example, any input in the &lt;span class="codeInline"&gt;TextBox&lt;/span&gt; is first converted to uppercase with the &lt;span class="codeInline"&gt;CaseConverter&lt;/span&gt; and then formatted via the &lt;span class="codeInline"&gt;FormatConverter&lt;/span&gt;. If all converters in the pipeline support backward conversions (not so in this case) then the &lt;span class="codeInline"&gt;ConverterGroup&lt;/span&gt; will also support backwards conversions.&lt;br /&gt;&lt;a name="MultiConverterGroup"&gt;&lt;/a&gt;
&lt;h2&gt;MultiConverterGroup&lt;/h2&gt;The &lt;span class="codeInline"&gt;MultiConverterGroup&lt;/span&gt; class has the same goals as the &lt;span class="codeInline"&gt;ConverterGroup&lt;/span&gt; class except that it is an implementation of &lt;span class="codeInline"&gt;IMultiValueConverter&lt;/span&gt; rather than &lt;span class="codeInline"&gt;IValueConverter&lt;/span&gt;. It works with a pipeline of steps (represented by instances of &lt;span class="codeInline"&gt;MultiConverterGroupStep&lt;/span&gt;). Each step can have any number of multi-value converters in it. The output from each step is the combined output from each converter in the step. This output is then fed into the next step.&lt;br /&gt;&lt;br /&gt;If your head hurts from reading that (mine sure does after writing it) then perhaps this diagram will help:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=wpfconverters&amp;DownloadId=25507" alt="MultiConverterGroup.png" title="MultiConverterGroup.png" /&gt;&lt;br /&gt;&lt;br /&gt;The above example defines three steps in the conversion pipeline. The &lt;span class="codeInline"&gt;MultiConverterGroup&lt;/span&gt; combines objects output from the converters in &lt;i&gt;Step 1&lt;/i&gt; and uses that as the input to &lt;i&gt;Step 2&lt;/i&gt;. Similarly, the output from &lt;i&gt;Step 2&lt;/i&gt; is fed into &lt;i&gt;Step 3&lt;/i&gt;. The XAML for this example would look like this:&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiConverterGroup&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiConverterGroupStep&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Converter1&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Converter2&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Converter3&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiConverterGroupStep&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiConverterGroupStep&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Converter4&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Converter5&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Converter6&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiConverterGroupStep&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiConverterGroupStep&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Converter7&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiConverterGroupStep&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiConverterGroup&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;Note that the last step must always have exactly one converter, which makes sense because at the end of the day the pipeline needs to produce a single value. If you violate this constraint, you’ll get an exception.&lt;br /&gt;&lt;br /&gt;That covers forward conversions, but what about backward conversions? If you examine the diagram, you’ll realize that a backward conversion starts at the bottom and heads toward the top, but could take one of many paths. In theory, if all converters are implemented correctly and they all support backward conversions, then any path from the bottom to the top with the same input would yield the same output.&lt;br /&gt;&lt;br /&gt;In practice, the &lt;span class="codeInline"&gt;MultiConverterGroup&lt;/span&gt; solves this ambiguity by leaning on the left-hand side of the path when converting backwards. In the example, it will pass output from &lt;span class="codeInline"&gt;Converter7&lt;/span&gt; into &lt;span class="codeInline"&gt;Converter4&lt;/span&gt; and then pass the output from that into &lt;span class="codeInline"&gt;Converter1&lt;/span&gt;.&lt;br /&gt;&lt;a name="TypeConverter"&gt;&lt;/a&gt;
&lt;h2&gt;TypeConverter&lt;/h2&gt;The &lt;span class="codeInline"&gt;TypeConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;TypeConverterExtension&lt;/span&gt; classes provide the ability to convert input values to different types. It is essentially a public implementation of the &lt;span class="codeInline"&gt;internal DefaultValueConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;SystemConvertConverter&lt;/span&gt; BCL types. It is useful in coercing a value to required type during a pipeline conversion using &lt;span class="codeInline"&gt;ConverterGroup&lt;/span&gt;. Using it is straightforward:&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label.Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt; &lt;span style="color:Red;"&gt;Path&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Dob&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding.Converter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
				&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;ConverterGroup&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
					&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TypeConverter&lt;/span&gt; &lt;span style="color:Red;"&gt;TargetType&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{x:Type sys:DateTime}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
					&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;DateTimeConverter&lt;/span&gt; &lt;span style="color:Red;"&gt;TargetKind&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Local&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
				&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;ConverterGroup&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding.Converter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label.Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;In this highly fabricated example, there is a &lt;span class="codeInline"&gt;Dob&lt;/span&gt; property that is a &lt;span class="codeInline"&gt;string&lt;/span&gt; when it really should be a &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;. A &lt;span class="codeInline"&gt;TypeConverter&lt;/span&gt; is used to convert the &lt;span class="codeInline"&gt;string&lt;/span&gt; to a &lt;span class="codeInline"&gt;DateTime&lt;/span&gt; prior to feeding it into a &lt;span class="codeInline"&gt;DateTimeConverter&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The &lt;span class="codeInline"&gt;TypeConverter&lt;/span&gt; will first attempt to convert data by way of an &lt;span class="codeInline"&gt;IConvertible&lt;/span&gt; implementation. If the value does not implement &lt;span class="codeInline"&gt;IConvertible&lt;/span&gt; then an attempt will be made to use any &lt;span class="codeInline"&gt;System.ComponentModel.TypeConverter&lt;/span&gt; implementation type for the class. If all attempts to convert the value fail, &lt;span class="codeInline"&gt;DependencyProperty.UnsetValue&lt;/span&gt; will be returned.&lt;br /&gt;&lt;a name="DataBindingAndConverters"&gt;&lt;/a&gt;
&lt;h1&gt;Data Binding and Converters&lt;/h1&gt;The observant among you may have noticed that my converter implementations inherit from &lt;span class="codeInline"&gt;DependencyObject&lt;/span&gt; and define their properties as &lt;span class="codeInline"&gt;DependencyProperty&lt;/span&gt;s. You may see this and try something like:&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label.Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt; &lt;span style="color:Red;"&gt;Path&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Name&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding.Converter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
				&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;CaseConverter&lt;/span&gt; &lt;span style="color:Red;"&gt;Casing&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{Binding Casing}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding.Converter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label.Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;Alas, this won’t work, at least with the current version of WPF. You’ll get an error:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Casing; DataItem=null; target element is &amp;#39;CaseConverter&amp;#39;
&lt;/pre&gt;&lt;br /&gt;So why did I bother with &lt;span class="codeInline"&gt;DependencyObject&lt;/span&gt;s? Well, if you really need to bind properties on your converters you can use &lt;a href="http://Josh Smith’s virtual branch technique" class="externalLink"&gt;http://www.codeproject.com/WPF/AttachingVirtualBranches.asp&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; to do so.&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>kentcb</author><pubDate>Fri, 26 Feb 2010 19:32:06 GMT</pubDate><guid isPermaLink="false">Updated Wiki: User Documentation 20100226073206P</guid></item><item><title>Updated Wiki: User Documentation</title><link>http://wpfconverters.codeplex.com/wikipage?title=User Documentation&amp;version=5</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;User Documentation&lt;/h1&gt;&lt;h2&gt;Contents&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="#Overview"&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#SetUp"&gt;Set Up&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#Converters"&gt;Converters&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="#CaseConverter"&gt;CaseConverter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#FormatConverter"&gt;FormatConverter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#DateTimeConverter"&gt;DateTimeConverter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#MapConverter"&gt;MapConverter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ExpressionConverter"&gt;ExpressionConverter&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="#AWord"&gt;A Word on the ExpressionConverter&amp;#8217;s Parser&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ConverterGroup"&gt;ConverterGroup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#MultiConverterGroup"&gt;MultiConverterGroup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#TypeConverter"&gt;TypeConverter&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#DataBindingAndConverters"&gt;Data Binding and Converters&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;a name="Overview"&gt;&lt;/a&gt;
&lt;h1&gt;Overview&lt;/h1&gt;WPF’s &lt;span class="codeInline"&gt;Binding&lt;/span&gt; and &lt;span class="codeInline"&gt;MultiBinding&lt;/span&gt; types define a &lt;span class="codeInline"&gt;Converter&lt;/span&gt; property that allows you to provide a converter that will be used during the binding process. If you don’t explicitly specify a value converter, WPF will use its built-in primitive ones behind the scenes (such as &lt;span class="codeInline"&gt;DefaultValueConverter&lt;/span&gt;, &lt;span class="codeInline"&gt;ObjectTargetConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;SystemConvertConverter&lt;/span&gt; – all are &lt;span class="codeInline"&gt;internal&lt;/span&gt; types defined in the &lt;span class="codeInline"&gt;MS.Internal.Data&lt;/span&gt; namespace).&lt;br /&gt;&lt;br /&gt;If you &lt;i&gt;do&lt;/i&gt; specify a value converter, WPF will invoke methods on your converter during the data binding process. These methods are:
&lt;ul&gt;&lt;li&gt;&lt;span class="codeInline"&gt;Convert()&lt;/span&gt;. Called to convert a value when propagating it from the binding source to the binding target.&lt;/li&gt;
&lt;li&gt;&lt;span class="codeInline"&gt;ConvertBack()&lt;/span&gt;. Called to convert a value when propagating it from the binding target to the binding source.&lt;/li&gt;&lt;/ul&gt;
The following diagram depicts this process:&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=wpfconverters&amp;DownloadId=25506" alt="Binding.png" title="Binding.png" /&gt;&lt;br /&gt;What I have found whilst working with WPF is that value converters (shown in the middle of the above diagram) are often needed to solve similar problems. This article and code library seeks to address the most common converter requirements and alleviate the need for a lot of custom converter code in any WPF application.&lt;br /&gt;&lt;br /&gt;The following converters are included in this project:&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt; Name &lt;/th&gt;&lt;th&gt; Supports Singular Conversions &lt;/th&gt;&lt;th&gt; Supports Multiple Conversions &lt;/th&gt;&lt;th&gt; Supports Forward Conversions &lt;/th&gt;&lt;th&gt; Supports Backward Conversions &lt;/th&gt;&lt;th&gt; Has Markup Extension &lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#CaseConverter"&gt;CaseConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#ConverterGroup"&gt;ConverterGroup&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes (1) &lt;/td&gt;&lt;td&gt; Yes (2) &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#DateTimeConverter"&gt;DateTimeConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#ExpressionConverter"&gt;ExpressionConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes (3) &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#FormatConverter"&gt;FormatConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes (4) &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#MapConverter"&gt;MapConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#MultiConverterGroup"&gt;MultiConverterGroup&lt;/a&gt; &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes (5) &lt;/td&gt;&lt;td&gt; Yes (6) &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#TypeConverter"&gt;TypeConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;ol&gt;&lt;li&gt;Assuming all child converters support forward conversions.&lt;/li&gt;
&lt;li&gt;Assuming all child converters support backward conversions.&lt;/li&gt;
&lt;li&gt;In fact, this is the only way to use the expression converter.&lt;/li&gt;
&lt;li&gt;Only for singular conversions.&lt;/li&gt;
&lt;li&gt;Assuming all child converters support forward conversions.&lt;/li&gt;
&lt;li&gt;Assuming all child converters support backward conversions.&lt;/li&gt;&lt;/ol&gt;
&lt;a name="UsingWPFConverters"&gt;&lt;/a&gt;
&lt;h1&gt;Using WPF Converters&lt;/h1&gt;To use WPF Converters, you need to:
&lt;ol&gt;&lt;li&gt;Add a reference to the &lt;i&gt;Kent.Boogaart.Converters.dll&lt;/i&gt; assembly.&lt;/li&gt;
&lt;li&gt;Declare an XML-&amp;gt;CLR namespace mapping to &lt;i&gt;http://schemas.kent.boogaart.com/converters&lt;/i&gt;.&lt;/li&gt;&lt;/ol&gt;
&lt;br /&gt;All the examples on this page assume a declaration such as:&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Window&lt;/span&gt; &lt;span style="color:Red;"&gt;xmlns:con&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;http://schemas.kent.boogaart.com/converters&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;a name="Converters"&gt;&lt;/a&gt;
&lt;h1&gt;Converters&lt;/h1&gt;In this section, each of the converters will be discussed in some detail. Note that there are further usage examples available in the API documentation.&lt;br /&gt;&lt;a name="CaseConverter"&gt;&lt;/a&gt;
&lt;h2&gt;CaseConverter&lt;/h2&gt;The &lt;span class="codeInline"&gt;CaseConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;CaseConverterExtension&lt;/span&gt; classes allow you to convert a &lt;span class="codeInline"&gt;string&lt;/span&gt; to upper or lower case. They accept a single parameter: &lt;span class="codeInline"&gt;Casing&lt;/span&gt;, which is used to specify the desired case for the resultant &lt;span class="codeInline"&gt;string&lt;/span&gt;. It is very simple to use, as the following example demonstrates:&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_textBox&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt; &lt;span style="color:Red;"&gt;Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{Binding Text, ElementName=_textBox, Converter={con:CaseConverter Upper}}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt; &lt;span style="color:Red;"&gt;Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{Binding Text, ElementName=_textBox, Converter={con:CaseConverter Lower}}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;Anything typed in the &lt;span class="codeInline"&gt;TextBox&lt;/span&gt; will be displayed in uppercase in the first &lt;span class="codeInline"&gt;Label&lt;/span&gt;, and lowercase in the second.&lt;br /&gt;&lt;a name="FormatConverter"&gt;&lt;/a&gt;
&lt;h2&gt;FormatConverter&lt;/h2&gt;The &lt;span class="codeInline"&gt;FormatConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;FormatConverterExtension&lt;/span&gt; classes allow you to convert any number of &lt;span class="codeInline"&gt;object&lt;/span&gt;s to a &lt;span class="codeInline"&gt;string&lt;/span&gt; by using .NET’s standard formatting capabilities. They accept a single parameter: &lt;span class="codeInline"&gt;FormatString&lt;/span&gt;, which defines the format for the resultant &lt;span class="codeInline"&gt;string&lt;/span&gt;.&lt;br /&gt;When binding to a single value it can be used as follows:&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_textBox&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt; &lt;span style="color:Red;"&gt;Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{Binding Text, ElementName=_textBox, Converter={con:FormatConverter {}Your name is {0}}}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;Note how the format &lt;span class="codeInline"&gt;string&lt;/span&gt; passed to the &lt;span class="codeInline"&gt;FormatConverter&lt;/span&gt; is escaped with &amp;quot;{}&amp;quot;, which is necessary because it contains the &amp;quot; and &amp;quot; characters within it. The format &lt;span class="codeInline"&gt;string&lt;/span&gt; on its own is simply &amp;quot;Your name is {0}&amp;quot;.&lt;br /&gt;Binding to multiple values looks like this:&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_textBox1&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_textBox2&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label.Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiBinding&lt;/span&gt; &lt;span style="color:Red;"&gt;Converter&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{con:FormatConverter {}You said {0} and {1}.}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt; &lt;span style="color:Red;"&gt;Path&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Text&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;ElementName&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_textBox1&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt; &lt;span style="color:Red;"&gt;Path&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Text&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;ElementName&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_textBox2&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiBinding&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label.Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;a name="DateTimeConverter"&gt;&lt;/a&gt;
&lt;h2&gt;DateTimeConverter&lt;/h2&gt;The &lt;span class="codeInline"&gt;DateTimeConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;DateTimeConverterExtension&lt;/span&gt; classes allow you to perform specialized conversions on &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s during data binding. Using these classes, you can do any of the following:
&lt;ul&gt;&lt;li&gt;Convert between different kinds of &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s (e.g. convert between UTC and local time).&lt;/li&gt;
&lt;li&gt;Convert between different kinds of &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s without changing the underlying &lt;span class="codeInline"&gt;DateTime&lt;/span&gt; value (i.e. convert by using &lt;span class="codeInline"&gt;DateTime.SpecifyKind()&lt;/span&gt; instead of &lt;span class="codeInline"&gt;ToLocalTime()&lt;/span&gt; or &lt;span class="codeInline"&gt;ToUniversalTime()&lt;/span&gt;).&lt;/li&gt;
&lt;li&gt;Adjust &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s during conversion by adding a &lt;span class="codeInline"&gt;TimeSpan&lt;/span&gt; to them.&lt;/li&gt;&lt;/ul&gt;
The &lt;span class="codeInline"&gt;DateTimeConverter&lt;/span&gt; supports both forward and backwards conversions. This allows you, for example, to store &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s in UTC format in your business objects but convert them to local time prior to using them in your interface. The following example shows how you could achieve this (and assumes the existence of a WPF &lt;span class="codeInline"&gt;DatePicker&lt;/span&gt; class):&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;DatePicker&lt;/span&gt; &lt;span style="color:Red;"&gt;Value&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{Binding StartDate, Converter={con:DateTimeConverter TargetKind=Local, SourceKind=Utc}}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;a name="MapConverter"&gt;&lt;/a&gt;
&lt;h2&gt;MapConverter&lt;/h2&gt;The &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; class (which has no corresponding markup extension) can be used to map one set of values to another. This is an extremely useful converter that has many use cases. Here are some examples:
&lt;ul&gt;&lt;li&gt;Converting enumeration values to human-readable strings prior to display.&lt;/li&gt;
&lt;li&gt;Converting between &lt;span class="codeInline"&gt;bool&lt;/span&gt; values and &lt;span class="codeInline"&gt;Visibility&lt;/span&gt; enumeration values.&lt;/li&gt;
&lt;li&gt;Converting between &lt;span class="codeInline"&gt;bool&lt;/span&gt; values and an &lt;span class="codeInline"&gt;ImageSource&lt;/span&gt; so the user sees a tick or a cross depending on the &lt;span class="codeInline"&gt;bool&lt;/span&gt; value.&lt;/li&gt;&lt;/ul&gt;
The &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; works by using a collection of &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; objects. Each &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; object specifies a value to map &lt;i&gt;from&lt;/i&gt; and a value to map &lt;i&gt;to&lt;/i&gt;. The same &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; objects are used both for forward conversions and backward conversions.&lt;br /&gt;If no relevant &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; object can be found during a conversion, the &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; uses its &lt;span class="codeInline"&gt;FallbackBehavior&lt;/span&gt; property to decide what to do. You can tell it to either return &lt;span class="codeInline"&gt;DependencyProperty.UnsetValue&lt;/span&gt; or to return the value it was asked to convert.&lt;br /&gt;An example should make this all clear:&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label.Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt; &lt;span style="color:Red;"&gt;Path&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Gender&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding.Converter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
				&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MapConverter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
					&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Mapping&lt;/span&gt; &lt;span style="color:Red;"&gt;From&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{x:Static Gender.Male}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;To&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Guy&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
					&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Mapping&lt;/span&gt; &lt;span style="color:Red;"&gt;From&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{x:Static Gender.Female}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;To&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Gal&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
				&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MapConverter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding.Converter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label.Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;This example uses a &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; to convert from members in a &lt;span class="codeInline"&gt;Gender&lt;/span&gt; enumeration to either &amp;quot;Guy&amp;quot; or &amp;quot;Gal&amp;quot;. Now suppose that the &lt;span class="codeInline"&gt;Gender&lt;/span&gt; enumeration also defines a value of &lt;span class="codeInline"&gt;Unknown&lt;/span&gt; (a wise move in these modern times). The above mapping won’t successfully convert values of &lt;span class="codeInline"&gt;Unknown&lt;/span&gt; – it will just return &lt;span class="codeInline"&gt;DependencyProperty.UnsetValue&lt;/span&gt; instead.&lt;br /&gt;If you want unknown genders to display as &amp;quot;Unknown&amp;quot; you can either add another &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; or just tell the &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; to return the original value if it cannot map the value it is given:&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MapConverter&lt;/span&gt; &lt;span style="color:Red;"&gt;FallbackBehavior&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;ReturnOriginalValue&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Mapping&lt;/span&gt; &lt;span style="color:Red;"&gt;From&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{x:Static Gender.Male}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;To&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Guy&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Mapping&lt;/span&gt; &lt;span style="color:Red;"&gt;From&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{x:Static Gender.Female}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;To&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Gal&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MapConverter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;A &lt;span class="codeInline"&gt;FallbackBehavior&lt;/span&gt; of &lt;span class="codeInline"&gt;ReturnOriginalValue&lt;/span&gt; is extremely useful where you only want to map a subset of the total possible values.&lt;br /&gt;&lt;a name="ExpressionConverter"&gt;&lt;/a&gt;
&lt;h2&gt;ExpressionConverter&lt;/h2&gt;The &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;ExpressionConverterExtension&lt;/span&gt; classes allow you to convert one or more bound values by running them through a C#-like expression. The expression uses placeholders of the form &lt;span class="codeInline"&gt;{x&lt;/span&gt;} to demarcate bound arguments, where &lt;span class="codeInline"&gt;x&lt;/span&gt; is the argument number starting at zero.&lt;br /&gt;&lt;br /&gt;Let’s start with something simple:&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Canvas&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Slider&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_slider&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;Width&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;300&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;Minimum&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;1&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;Maximum&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;100&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Rectangle&lt;/span&gt; &lt;span style="color:Red;"&gt;Canvas.Top&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;20&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;Fill&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Red&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;Width&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;100&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;Height&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{Binding Value, ElementName=_slider}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Rectangle&lt;/span&gt; &lt;span style="color:Red;"&gt;Canvas.Top&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;100&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;Fill&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Blue&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;Width&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;100&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;Height&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{Binding Value, ElementName=_slider, Converter={con:ExpressionConverter {}{0} * 2}}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Canvas&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;In this example, the value of the &lt;span class="codeInline"&gt;Slider&lt;/span&gt; dictates the height of the first rectangle. It also dictates the height of the second rectangle, but an &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; is used to double the value first.&lt;br /&gt;&lt;br /&gt;Notice how the expression passed to the &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; is escaped with &amp;quot;{}&amp;quot;. As with the FormatConverter, this is necessary because it includes the &amp;quot; and &amp;quot; characters. The expression on its own is simply &lt;span class="codeInline"&gt;&amp;quot;{0} * 2&amp;quot;&lt;/span&gt;. In English, this means &amp;quot;multiply the first argument by two&amp;quot;.&lt;br /&gt;&lt;br /&gt;Now, let’s do something a little more complex:&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;StackPanel&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_panel&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;What bands do you like?&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;CheckBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_rammstein&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;Rammstein&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;CheckBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_powderfinger&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;Powderfinger&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;CheckBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_nickelback&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;Nickelback&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;CheckBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_ministry&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;Ministry&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Button&lt;/span&gt; &lt;span style="color:Red;"&gt;Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Let me in!&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Button.IsEnabled&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiBinding&lt;/span&gt; &lt;span style="color:Red;"&gt;Converter&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{ExpressionConverter {}{0} &amp;amp;amp;&amp;amp;amp; {1} &amp;amp;amp;&amp;amp;amp; {3} &amp;amp;amp;&amp;amp;amp; !{2}}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
				&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt; &lt;span style="color:Red;"&gt;Path&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;IsChecked&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;ElementName&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_rammstein&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
				&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt; &lt;span style="color:Red;"&gt;Path&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;IsChecked&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;ElementName&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_powderfinger&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
				&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt; &lt;span style="color:Red;"&gt;Path&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;IsChecked&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;ElementName&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_nickelback&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
				&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt; &lt;span style="color:Red;"&gt;Path&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;IsChecked&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;ElementName&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_ministry&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiBinding&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Button.IsEnabled&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Button&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;In this example, the entry button is only enabled if the correct combination of bands is chosen. If you don’t like one of the good bands or if you &lt;i&gt;do&lt;/i&gt; like the sucky band, you won’t be allowed in.&lt;br /&gt;&lt;br /&gt;The actual expression has again been escaped due to its presence in XAML. Unescaped, it is simply &lt;span class="codeInline"&gt;&amp;quot;{0} &amp;amp;&amp;amp; {1} &amp;amp;&amp;amp; {3} &amp;amp;&amp;amp; !{2}&amp;quot;. An alternative approach that avoids all this escaping is to use a more long-winded syntax in the {{MultiBinding&lt;/span&gt; as follows:&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiBinding&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiBinding.Converter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;ExpressionConverterExtension&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;ExpressionConverterExtension.Expression&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
				&lt;span style="color:Blue;"&gt;&amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color:Gray;"&gt;
				{0} &amp;amp;&amp;amp; {1} &amp;amp;&amp;amp; {3} &amp;amp;&amp;amp; !{2}
				&lt;/span&gt;&lt;span style="color:Blue;"&gt;]]&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;ExpressionConverterExtension.Expression&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;ExpressionConverterExtension&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiBinding.Converter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiBinding&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;The &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; supports a lot of C# operators and we’ve only scratched the surface of the possibilities here. Please see the API documentation for a full list of supported operators.&lt;br /&gt;&lt;a name="AWord"&gt;&lt;/a&gt;
&lt;h3&gt;A Word on the ExpressionConverter’s Parser&lt;/h3&gt;I am not going to go into detail here on the implementation of the parser behind the &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt;. For a good overview on writing a code parser, you should check out &lt;a href="http://Tommy Carlier’s series" class="externalLink"&gt;http://tommycarlier.blogspot.com/2007/05/writing-parser-overview.html&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; or any good book on compiler construction. However, I would like to point out a few things.&lt;br /&gt;&lt;br /&gt;Firstly, I did not leverage .NET’s C# CodeDom implementation to parse the expressions. This was due to the imposed security restrictions. I want the &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; to be usable in low trust applications (including Silverlight).&lt;br /&gt;&lt;br /&gt;Secondly, I did not leverage ANTLR to generate the parser because then my library would have a dependency of the .NET ANTLR runtime. This was not an option as I was trying to keep the overhead of my library to a minimum. Of course, I did experiment with both CodeDom and ANTLR prior to implementing the parser. This gave me some insights and helped me formulate goals for the parser. Some things that are not supported by my implementation are:
&lt;ul&gt;&lt;li&gt;Verbatim &lt;span class="codeInline"&gt;string&lt;/span&gt;s (i.e. strings starting with &lt;span class="codeInline"&gt;@&lt;/span&gt;).&lt;/li&gt;
&lt;li&gt;Hexadecimal or Unicode escape sequences in &lt;span class="codeInline"&gt;string&lt;/span&gt;s (but common escape sequences such as &lt;span class="codeInline"&gt;\n&lt;/span&gt; and &lt;span class="codeInline"&gt;\t&lt;/span&gt; are supported).&lt;/li&gt;
&lt;li&gt;Property accessors (e.g. an expression such as &lt;span class="codeInline"&gt;&amp;quot;{0}.Age &amp;gt; 18&amp;quot;&lt;/span&gt; will not work).&lt;/li&gt;
&lt;li&gt;Array indexers (e.g. an expression such as &lt;span class="codeInline"&gt;&amp;quot;{0}[0] &amp;gt; {0}[1]&amp;quot;&lt;/span&gt; will not work).&lt;/li&gt;
&lt;li&gt;Branching statements (and in particular, no ternary operator).&lt;/li&gt;&lt;/ul&gt;
These features were left out consciously: either because of space constraints, concerns about abuse, or concerns about the efficiency of an interpretive implementation. If you feel there is good reason to include some of these features then please let me know. If you make a strong case I may well add your feature of choice.&lt;br /&gt;&lt;br /&gt;Finally, as I hinted at above, the current implementation of the parser functions as an interpreter. It does not yet leverage .NET’s &lt;span class="codeInline"&gt;DynamicMethod&lt;/span&gt; class to produce compiled output, but it may in the future . Note that expressions given to the &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; are parsed only once. After being parsed, the same abstract syntax tree (AST) is used to evaluate the expression any number of times. Having said that, evaluation of the expressions will be slower than an otherwise equivalent implementation based on &lt;span class="codeInline"&gt;DynamicMethod&lt;/span&gt;. If this proves to be a problem in the real world then I may change the implementation.&lt;br /&gt;&lt;a name="ConverterGroup"&gt;&lt;/a&gt;
&lt;h2&gt;ConverterGroup&lt;/h2&gt;The &lt;span class="codeInline"&gt;Binding&lt;/span&gt; class only allows you to provide one converter. The &lt;span class="codeInline"&gt;ConverterGroup&lt;/span&gt; class allows you to construct a pipeline of converters that can be assigned to a &lt;span class="codeInline"&gt;Binding&lt;/span&gt;, which essentially annuls this restriction. Here’s an example:&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TextBox&lt;/span&gt; &lt;span style="color:Red;"&gt;x:Name&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_textBox&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label.Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt; &lt;span style="color:Red;"&gt;Path&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Text&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt; &lt;span style="color:Red;"&gt;ElementName&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;_textBox&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding.Converter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
				&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;ConverterGroup&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
					&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;CaseConverter&lt;/span&gt; &lt;span style="color:Red;"&gt;Casing&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Upper&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
					&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;FormatConverter&lt;/span&gt; &lt;span style="color:Red;"&gt;FormatString&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;In uppercase, you entered ‘{0}’.&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
				&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;ConverterGroup&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding.Converter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label.Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;In this example, any input in the &lt;span class="codeInline"&gt;TextBox&lt;/span&gt; is first converted to uppercase with the &lt;span class="codeInline"&gt;CaseConverter&lt;/span&gt; and then formatted via the &lt;span class="codeInline"&gt;FormatConverter&lt;/span&gt;. If all converters in the pipeline support backward conversions (not so in this case) then the &lt;span class="codeInline"&gt;ConverterGroup&lt;/span&gt; will also support backwards conversions.&lt;br /&gt;&lt;a name="MultiConverterGroup"&gt;&lt;/a&gt;
&lt;h2&gt;MultiConverterGroup&lt;/h2&gt;The &lt;span class="codeInline"&gt;MultiConverterGroup&lt;/span&gt; class has the same goals as the &lt;span class="codeInline"&gt;ConverterGroup&lt;/span&gt; class except that it is an implementation of &lt;span class="codeInline"&gt;IMultiValueConverter&lt;/span&gt; rather than &lt;span class="codeInline"&gt;IValueConverter&lt;/span&gt;. It works with a pipeline of steps (represented by instances of &lt;span class="codeInline"&gt;MultiConverterGroupStep&lt;/span&gt;). Each step can have any number of multi-value converters in it. The output from each step is the combined output from each converter in the step. This output is then fed into the next step.&lt;br /&gt;&lt;br /&gt;If your head hurts from reading that (mine sure does after writing it) then perhaps this diagram will help:&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=wpfconverters&amp;DownloadId=25507" alt="MultiConverterGroup.png" title="MultiConverterGroup.png" /&gt;&lt;br /&gt;The above example defines three steps in the conversion pipeline. The &lt;span class="codeInline"&gt;MultiConverterGroup&lt;/span&gt; combines objects output from the converters in &lt;i&gt;Step 1&lt;/i&gt; and uses that as the input to &lt;i&gt;Step 2&lt;/i&gt;. Similarly, the output from &lt;i&gt;Step 2&lt;/i&gt; is fed into &lt;i&gt;Step 3&lt;/i&gt;. The XAML for this example would look like this:&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiConverterGroup&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiConverterGroupStep&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Converter1&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Converter2&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Converter3&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiConverterGroupStep&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiConverterGroupStep&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Converter4&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Converter5&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Converter6&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiConverterGroupStep&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiConverterGroupStep&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Converter7&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiConverterGroupStep&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;MultiConverterGroup&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;Note that the last step must always have exactly one converter, which makes sense because at the end of the day the pipeline needs to produce a single value. If you violate this constraint, you’ll get an exception.&lt;br /&gt;&lt;br /&gt;So that covers forward conversions, but what about backward conversions? If you examine the diagram, you’ll realize that a backward conversion starts at the bottom and heads toward the top, but could take one of many paths. In theory, if all converters are implemented correctly and they all support backward conversions, then any path from the bottom to the top with the same input would yield the same output.&lt;br /&gt;&lt;br /&gt;In practice, the &lt;span class="codeInline"&gt;MultiConverterGroup&lt;/span&gt; solves this ambiguity by leaning on the left-hand side of the path when converting backwards. In the example, it will pass output from &lt;span class="codeInline"&gt;Converter7&lt;/span&gt; into &lt;span class="codeInline"&gt;Converter4&lt;/span&gt; and then pass the output from that into &lt;span class="codeInline"&gt;Converter1&lt;/span&gt;.&lt;br /&gt;&lt;a name="TypeConverter"&gt;&lt;/a&gt;
&lt;h2&gt;TypeConverter&lt;/h2&gt;The &lt;span class="codeInline"&gt;TypeConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;TypeConverterExtension&lt;/span&gt; classes provide the ability to convert input values to different types. It is essentially a public implementation of the &lt;span class="codeInline"&gt;internal DefaultValueConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;SystemConvertConverter&lt;/span&gt; BCL types. It is useful in coercing a value to required type during a pipeline conversion using &lt;span class="codeInline"&gt;ConverterGroup&lt;/span&gt;. Using it is straightforward:&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label.Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt; &lt;span style="color:Red;"&gt;Path&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Dob&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding.Converter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
				&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;ConverterGroup&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
					&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;TypeConverter&lt;/span&gt; &lt;span style="color:Red;"&gt;TargetType&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{x:Type sys:DateTime}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
					&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;DateTimeConverter&lt;/span&gt; &lt;span style="color:Red;"&gt;TargetKind&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Local&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
				&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;ConverterGroup&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding.Converter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label.Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;In this highly fabricated example, there is a &lt;span class="codeInline"&gt;Dob&lt;/span&gt; property that is a &lt;span class="codeInline"&gt;string&lt;/span&gt; when it really should be a &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;. A &lt;span class="codeInline"&gt;TypeConverter&lt;/span&gt; is used to convert the &lt;span class="codeInline"&gt;string&lt;/span&gt; to a &lt;span class="codeInline"&gt;DateTime&lt;/span&gt; prior to feeding it into a &lt;span class="codeInline"&gt;DateTimeConverter&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The &lt;span class="codeInline"&gt;TypeConverter&lt;/span&gt; will first attempt to convert data by way of an &lt;span class="codeInline"&gt;IConvertible&lt;/span&gt; implementation. If the value does not implement &lt;span class="codeInline"&gt;IConvertible&lt;/span&gt; then an attempt will be made to use any &lt;span class="codeInline"&gt;System.ComponentModel.TypeConverter&lt;/span&gt; implementation type for the class. If all attempts to convert the value fail, &lt;span class="codeInline"&gt;DependencyProperty.UnsetValue&lt;/span&gt; will be returned.&lt;br /&gt;&lt;a name="DataBindingAndConverters"&gt;&lt;/a&gt;
&lt;h1&gt;Data Binding and Converters&lt;/h1&gt;The observant among you may have noticed that my converter implementations inherit from &lt;span class="codeInline"&gt;DependencyObject&lt;/span&gt; and define their properties as &lt;span class="codeInline"&gt;DependencyProperty&lt;/span&gt;s. You may see this and try something like:&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label.Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt; &lt;span style="color:Red;"&gt;Path&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Name&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding.Converter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
				&lt;span style="color:Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;con&lt;/span&gt;&lt;span style="color:Blue;"&gt;:&lt;/span&gt;&lt;span style="color:#A31515;"&gt;CaseConverter&lt;/span&gt; &lt;span style="color:Red;"&gt;Casing&lt;/span&gt;&lt;span style="color:Blue;"&gt;=&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;{Binding Casing}&lt;/span&gt;&lt;span style="color:Black;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:Blue;"&gt;/&amp;gt;&lt;/span&gt;
			&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding.Converter&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
		&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
	&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label.Content&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Label&lt;/span&gt;&lt;span style="color:Blue;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;Alas, this won’t work, at least with the current version of WPF. You’ll get an error:&lt;br /&gt;&lt;pre&gt;
Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Casing; DataItem=null; target element is &amp;#39;CaseConverter&amp;#39;
&lt;/pre&gt;&lt;br /&gt;So why did I bother with &lt;span class="codeInline"&gt;DependencyObject&lt;/span&gt;s? Well, if you really need to bind properties on your converters you can use &lt;a href="http://Josh Smith’s virtual branch technique" class="externalLink"&gt;http://www.codeproject.com/WPF/AttachingVirtualBranches.asp&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; to do so.&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>kentcb</author><pubDate>Fri, 26 Feb 2010 18:49:45 GMT</pubDate><guid isPermaLink="false">Updated Wiki: User Documentation 20100226064945P</guid></item><item><title>Updated Wiki: User Documentation</title><link>http://wpfconverters.codeplex.com/wikipage?title=User Documentation&amp;version=4</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;User Documentation&lt;/h1&gt;&lt;h2&gt;Contents&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="#Overview"&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#SetUp"&gt;Set Up&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#Converters"&gt;Converters&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="#CaseConverter"&gt;CaseConverter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#FormatConverter"&gt;FormatConverter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#DateTimeConverter"&gt;DateTimeConverter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#MapConverter"&gt;MapConverter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ExpressionConverter"&gt;ExpressionConverter&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="#AWord"&gt;A Word on the ExpressionConverter&amp;#8217;s Parser&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ConverterGroup"&gt;ConverterGroup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#MultiConverterGroup"&gt;MultiConverterGroup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#TypeConverter"&gt;TypeConverter&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#DataBindingAndConverters"&gt;Data Binding and Converters&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;a name="Overview"&gt;&lt;/a&gt;
&lt;h1&gt;Overview&lt;/h1&gt;WPF’s &lt;span class="codeInline"&gt;Binding&lt;/span&gt; and &lt;span class="codeInline"&gt;MultiBinding&lt;/span&gt; types define a &lt;span class="codeInline"&gt;Converter&lt;/span&gt; property that allows you to provide a converter that will be used during the binding process. If you don’t explicitly specify a value converter, WPF will use its built-in primitive ones behind the scenes (such as &lt;span class="codeInline"&gt;DefaultValueConverter&lt;/span&gt;, &lt;span class="codeInline"&gt;ObjectTargetConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;SystemConvertConverter&lt;/span&gt; – all are &lt;span class="codeInline"&gt;internal&lt;/span&gt; types defined in the &lt;span class="codeInline"&gt;MS.Internal.Data&lt;/span&gt; namespace).&lt;br /&gt;&lt;br /&gt;If you &lt;i&gt;do&lt;/i&gt; specify a value converter, WPF will invoke methods on your converter during the data binding process. These methods are:
&lt;ul&gt;&lt;li&gt;&lt;span class="codeInline"&gt;Convert()&lt;/span&gt;. Called to convert a value when propagating it from the binding source to the binding target.&lt;/li&gt;
&lt;li&gt;&lt;span class="codeInline"&gt;ConvertBack()&lt;/span&gt;. Called to convert a value when propagating it from the binding target to the binding source.&lt;/li&gt;&lt;/ul&gt;
The following diagram depicts this process:&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=wpfconverters&amp;DownloadId=25506" alt="Binding.png" title="Binding.png" /&gt;&lt;br /&gt;What I have found whilst working with WPF is that value converters (shown in the middle of the above diagram) are often needed to solve similar problems. This article and code library seeks to address the most common converter requirements and alleviate the need for a lot of custom converter code in any WPF application.&lt;br /&gt;&lt;br /&gt;The following converters are included in this project:&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt; Name &lt;/th&gt;&lt;th&gt; Supports Singular Conversions &lt;/th&gt;&lt;th&gt; Supports Multiple Conversions &lt;/th&gt;&lt;th&gt; Supports Forward Conversions &lt;/th&gt;&lt;th&gt; Supports Backward Conversions &lt;/th&gt;&lt;th&gt; Has Markup Extension &lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#CaseConverter"&gt;CaseConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#ConverterGroup"&gt;ConverterGroup&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes (1) &lt;/td&gt;&lt;td&gt; Yes (2) &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#DateTimeConverter"&gt;DateTimeConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#ExpressionConverter"&gt;ExpressionConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes (3) &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#FormatConverter"&gt;FormatConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes (4) &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#MapConverter"&gt;MapConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#MultiConverterGroup"&gt;MultiConverterGroup&lt;/a&gt; &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes (5) &lt;/td&gt;&lt;td&gt; Yes (6) &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#TypeConverter"&gt;TypeConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;ol&gt;&lt;li&gt;Assuming all child converters support forward conversions.&lt;/li&gt;
&lt;li&gt;Assuming all child converters support backward conversions.&lt;/li&gt;
&lt;li&gt;In fact, this is the only way to use the expression converter.&lt;/li&gt;
&lt;li&gt;Only for singular conversions.&lt;/li&gt;
&lt;li&gt;Assuming all child converters support forward conversions.&lt;/li&gt;
&lt;li&gt;Assuming all child converters support backward conversions.&lt;/li&gt;&lt;/ol&gt;
&lt;a name="UsingWPFConverters"&gt;&lt;/a&gt;
&lt;h1&gt;Using WPF Converters&lt;/h1&gt;To use WPF Converters, you need to:
&lt;ol&gt;&lt;li&gt;Add a reference to the &lt;i&gt;Kent.Boogaart.Converters.dll&lt;/i&gt; assembly.&lt;/li&gt;
&lt;li&gt;Declare an XML-&amp;gt;CLR namespace mapping to &lt;i&gt;http://schemas.kent.boogaart.com/converters&lt;/i&gt;.&lt;/li&gt;&lt;/ol&gt;
&lt;br /&gt;All the examples on this page assume a declaration such as:&lt;br /&gt;&lt;pre&gt;
&amp;lt;Window xmlns:con=&amp;quot;http://schemas.kent.boogaart.com/converters&amp;quot;&amp;gt;
&lt;/pre&gt;&lt;br /&gt;&lt;a name="Converters"&gt;&lt;/a&gt;
&lt;h1&gt;Converters&lt;/h1&gt;In this section, each of the converters will be discussed in some detail. Note that there are further usage examples available in the API documentation.&lt;br /&gt;&lt;a name="CaseConverter"&gt;&lt;/a&gt;
&lt;h2&gt;CaseConverter&lt;/h2&gt;The &lt;span class="codeInline"&gt;CaseConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;CaseConverterExtension&lt;/span&gt; classes allow you to convert a &lt;span class="codeInline"&gt;string&lt;/span&gt; to upper or lower case. They accept a single parameter: &lt;span class="codeInline"&gt;Casing&lt;/span&gt;, which is used to specify the desired case for the resultant &lt;span class="codeInline"&gt;string&lt;/span&gt;. It is very simple to use, as the following example demonstrates:&lt;br /&gt;&lt;pre&gt;
&amp;lt;TextBox x:Name=&amp;quot;_textBox&amp;quot;/&amp;gt;
&amp;lt;Label Content=&amp;quot;{Binding Text, ElementName=_textBox, Converter={con:CaseConverter Upper} }&amp;quot;/&amp;gt;
&amp;lt;Label Content=&amp;quot;{Binding Text, ElementName=_textBox, Converter={con:CaseConverter Lower} }&amp;quot;/&amp;gt;
&lt;/pre&gt;&lt;br /&gt;Anything typed in the &lt;span class="codeInline"&gt;TextBox&lt;/span&gt; will be displayed in uppercase in the first &lt;span class="codeInline"&gt;Label&lt;/span&gt;, and lowercase in the second.&lt;br /&gt;&lt;a name="FormatConverter"&gt;&lt;/a&gt;
&lt;h2&gt;FormatConverter&lt;/h2&gt;The &lt;span class="codeInline"&gt;FormatConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;FormatConverterExtension&lt;/span&gt; classes allow you to convert any number of &lt;span class="codeInline"&gt;object&lt;/span&gt;s to a &lt;span class="codeInline"&gt;string&lt;/span&gt; by using .NET’s standard formatting capabilities. They accept a single parameter: &lt;span class="codeInline"&gt;FormatString&lt;/span&gt;, which defines the format for the resultant &lt;span class="codeInline"&gt;string&lt;/span&gt;.&lt;br /&gt;When binding to a single value it can be used as follows:&lt;br /&gt;&lt;pre&gt;
&amp;lt;TextBox x:Name=&amp;quot;_textBox&amp;quot;/&amp;gt;
&amp;lt;Label Content=&amp;quot;{Binding Text, ElementName=_textBox, Converter={con:FormatConverter {}Your name is {0} } }&amp;quot;/&amp;gt;
&lt;/pre&gt;&lt;br /&gt;Note how the format &lt;span class="codeInline"&gt;string&lt;/span&gt; passed to the &lt;span class="codeInline"&gt;FormatConverter&lt;/span&gt; is escaped with &amp;quot;{}&amp;quot;, which is necessary because it contains the &amp;quot; and &amp;quot; characters within it. The format &lt;span class="codeInline"&gt;string&lt;/span&gt; on its own is simply &amp;quot;Your name is {0}&amp;quot;.&lt;br /&gt;Binding to multiple values looks like this:&lt;br /&gt;&lt;pre&gt;
&amp;lt;TextBox x:Name=&amp;quot;_textBox1&amp;quot;/&amp;gt;
&amp;lt;TextBox x:Name=&amp;quot;_textBox2&amp;quot;/&amp;gt;
&amp;lt;Label&amp;gt;
	&amp;lt;Label.Content&amp;gt;
		&amp;lt;MultiBinding Converter=&amp;quot;{con:FormatConverter {}You said {0} and {1}.}&amp;quot;&amp;gt;
			&amp;lt;Binding Path=&amp;quot;Text&amp;quot; ElementName=&amp;quot;_textBox1&amp;quot;/&amp;gt;
			&amp;lt;Binding Path=&amp;quot;Text&amp;quot; ElementName=&amp;quot;_textBox2&amp;quot;/&amp;gt;
		&amp;lt;/MultiBinding&amp;gt;
	&amp;lt;/Label.Content&amp;gt;
&amp;lt;/Label&amp;gt;
&lt;/pre&gt;&lt;br /&gt;&lt;a name="DateTimeConverter"&gt;&lt;/a&gt;
&lt;h2&gt;DateTimeConverter&lt;/h2&gt;The &lt;span class="codeInline"&gt;DateTimeConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;DateTimeConverterExtension&lt;/span&gt; classes allow you to perform specialized conversions on &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s during data binding. Using these classes, you can do any of the following:
&lt;ul&gt;&lt;li&gt;Convert between different kinds of &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s (e.g. convert between UTC and local time).&lt;/li&gt;
&lt;li&gt;Convert between different kinds of &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s without changing the underlying &lt;span class="codeInline"&gt;DateTime&lt;/span&gt; value (i.e. convert by using &lt;span class="codeInline"&gt;DateTime.SpecifyKind()&lt;/span&gt; instead of &lt;span class="codeInline"&gt;ToLocalTime()&lt;/span&gt; or &lt;span class="codeInline"&gt;ToUniversalTime()&lt;/span&gt;).&lt;/li&gt;
&lt;li&gt;Adjust &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s during conversion by adding a &lt;span class="codeInline"&gt;TimeSpan&lt;/span&gt; to them.&lt;/li&gt;&lt;/ul&gt;
The &lt;span class="codeInline"&gt;DateTimeConverter&lt;/span&gt; supports both forward and backwards conversions. This allows you, for example, to store &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s in UTC format in your business objects but convert them to local time prior to using them in your interface. The following example shows how you could achieve this (and assumes the existence of a WPF &lt;span class="codeInline"&gt;DatePicker&lt;/span&gt; class):&lt;br /&gt;&lt;pre&gt;
&amp;lt;DatePicker Value=&amp;quot;{Binding StartDate, Converter={con:DateTimeConverter TargetKind=Local, SourceKind=Utc} }&amp;quot;/&amp;gt;
&lt;/pre&gt;&lt;br /&gt;&lt;a name="MapConverter"&gt;&lt;/a&gt;
&lt;h2&gt;MapConverter&lt;/h2&gt;The &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; class (which has no corresponding markup extension) can be used to map one set of values to another. This is an extremely useful converter that has many use cases. Here are some examples:
&lt;ul&gt;&lt;li&gt;Converting enumeration values to human-readable strings prior to display.&lt;/li&gt;
&lt;li&gt;Converting between &lt;span class="codeInline"&gt;bool&lt;/span&gt; values and &lt;span class="codeInline"&gt;Visibility&lt;/span&gt; enumeration values.&lt;/li&gt;
&lt;li&gt;Converting between &lt;span class="codeInline"&gt;bool&lt;/span&gt; values and an &lt;span class="codeInline"&gt;ImageSource&lt;/span&gt; so the user sees a tick or a cross depending on the &lt;span class="codeInline"&gt;bool&lt;/span&gt; value.&lt;/li&gt;&lt;/ul&gt;
The &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; works by using a collection of &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; objects. Each &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; object specifies a value to map &lt;i&gt;from&lt;/i&gt; and a value to map &lt;i&gt;to&lt;/i&gt;. The same &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; objects are used both for forward conversions and backward conversions.&lt;br /&gt;If no relevant &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; object can be found during a conversion, the &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; uses its &lt;span class="codeInline"&gt;FallbackBehavior&lt;/span&gt; property to decide what to do. You can tell it to either return &lt;span class="codeInline"&gt;DependencyProperty.UnsetValue&lt;/span&gt; or to return the value it was asked to convert.&lt;br /&gt;An example should make this all clear:&lt;br /&gt;&lt;pre&gt;
&amp;lt;Label&amp;gt;
	&amp;lt;Label.Content&amp;gt;
		&amp;lt;Binding Path=&amp;quot;Gender&amp;quot;&amp;gt;
			&amp;lt;Binding.Converter&amp;gt;
				&amp;lt;con:MapConverter&amp;gt;
					&amp;lt;con:Mapping From=&amp;quot;{x:Static Gender.Male}&amp;quot; To=&amp;quot;Guy&amp;quot;/&amp;gt;
					&amp;lt;con:Mapping From=&amp;quot;{x:Static Gender.Female}&amp;quot; To=&amp;quot;Gal&amp;quot;/&amp;gt;
				&amp;lt;/con:MapConverter&amp;gt;
			&amp;lt;/Binding.Converter&amp;gt;
		&amp;lt;/Binding&amp;gt;
	&amp;lt;/Label.Content&amp;gt;
&amp;lt;/Label&amp;gt;
&lt;/pre&gt;&lt;br /&gt;This example uses a &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; to convert from members in a &lt;span class="codeInline"&gt;Gender&lt;/span&gt; enumeration to either &amp;quot;Guy&amp;quot; or &amp;quot;Gal&amp;quot;. Now suppose that the &lt;span class="codeInline"&gt;Gender&lt;/span&gt; enumeration also defines a value of &lt;span class="codeInline"&gt;Unknown&lt;/span&gt; (a wise move in these modern times). The above mapping won’t successfully convert values of &lt;span class="codeInline"&gt;Unknown&lt;/span&gt; – it will just return &lt;span class="codeInline"&gt;DependencyProperty.UnsetValue&lt;/span&gt; instead.&lt;br /&gt;If you want unknown genders to display as &amp;quot;Unknown&amp;quot; you can either add another &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; or just tell the &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; to return the original value if it cannot map the value it is given:&lt;br /&gt;&lt;pre&gt;
&amp;lt;con:MapConverter FallbackBehavior=&amp;quot;ReturnOriginalValue&amp;quot;&amp;gt;
	&amp;lt;con:Mapping From=&amp;quot;{x:Static Gender.Male}&amp;quot; To=&amp;quot;Guy&amp;quot;/&amp;gt;
	&amp;lt;con:Mapping From=&amp;quot;{x:Static Gender.Female}&amp;quot; To=&amp;quot;Gal&amp;quot;/&amp;gt;
&amp;lt;/con:MapConverter&amp;gt;
&lt;/pre&gt;&lt;br /&gt;A &lt;span class="codeInline"&gt;FallbackBehavior&lt;/span&gt; of &lt;span class="codeInline"&gt;ReturnOriginalValue&lt;/span&gt; is extremely useful where you only want to map a subset of the total possible values.&lt;br /&gt;&lt;a name="ExpressionConverter"&gt;&lt;/a&gt;
&lt;h2&gt;ExpressionConverter&lt;/h2&gt;The &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;ExpressionConverterExtension&lt;/span&gt; classes allow you to convert one or more bound values by running them through a C#-like expression. The expression uses placeholders of the form &lt;span class="codeInline"&gt;{x&lt;/span&gt;} to demarcate bound arguments, where &lt;span class="codeInline"&gt;x&lt;/span&gt; is the argument number starting at zero.&lt;br /&gt;&lt;br /&gt;Let’s start with something simple:&lt;br /&gt;&lt;pre&gt;
&amp;lt;Canvas&amp;gt;
	&amp;lt;Slider x:Name=&amp;quot;_slider&amp;quot; Width=&amp;quot;300&amp;quot; Minimum=&amp;quot;1&amp;quot; Maximum=&amp;quot;100&amp;quot;/&amp;gt;
	&amp;lt;Rectangle Canvas.Top=&amp;quot;20&amp;quot; Fill=&amp;quot;Red&amp;quot; Width=&amp;quot;100&amp;quot; Height=&amp;quot;{Binding Value, ElementName=_slider}&amp;quot;/&amp;gt;
	&amp;lt;Rectangle Canvas.Top=&amp;quot;100&amp;quot; Fill=&amp;quot;Blue&amp;quot; Width=&amp;quot;100&amp;quot; Height=&amp;quot;{Binding Value, ElementName=_slider, Converter={con:ExpressionConverter {}{0} * 2} }&amp;quot;/&amp;gt;
&amp;lt;/Canvas&amp;gt;
&lt;/pre&gt;&lt;br /&gt;In this example, the value of the &lt;span class="codeInline"&gt;Slider&lt;/span&gt; dictates the height of the first rectangle. It also dictates the height of the second rectangle, but an &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; is used to double the value first.&lt;br /&gt;&lt;br /&gt;Notice how the expression passed to the &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; is escaped with &amp;quot;{}&amp;quot;. As with the FormatConverter, this is necessary because it includes the &amp;quot; and &amp;quot; characters. The expression on its own is simply &lt;span class="codeInline"&gt;&amp;quot;{0} * 2&amp;quot;&lt;/span&gt;. In English, this means &amp;quot;multiply the first argument by two&amp;quot;.&lt;br /&gt;&lt;br /&gt;Now, let’s do something a little more complex:&lt;br /&gt;&lt;pre&gt;
&amp;lt;StackPanel x:Name=&amp;quot;_panel&amp;quot;&amp;gt;
	&amp;lt;Label&amp;gt;What bands do you like?&amp;lt;/Label&amp;gt;
	&amp;lt;CheckBox x:Name=&amp;quot;_rammstein&amp;quot;&amp;gt;Rammstein&amp;lt;/Label&amp;gt;
	&amp;lt;CheckBox x:Name=&amp;quot;_powderfinger&amp;quot;&amp;gt;Powderfinger&amp;lt;/Label&amp;gt;
	&amp;lt;CheckBox x:Name=&amp;quot;_nickelback&amp;quot;&amp;gt;Nickelback&amp;lt;/Label&amp;gt;
	&amp;lt;CheckBox x:Name=&amp;quot;_ministry&amp;quot;&amp;gt;Ministry&amp;lt;/Label&amp;gt;
	&amp;lt;Button Content=&amp;quot;Let me in!&amp;quot;&amp;gt;
		&amp;lt;Button.IsEnabled&amp;gt;
			&amp;lt;MultiBinding Converter=&amp;quot;{ExpressionConverter {}{0} &amp;amp;amp;&amp;amp;amp; {1} &amp;amp;amp;&amp;amp;amp; {3} &amp;amp;amp;&amp;amp;amp; !{2} }&amp;quot;&amp;gt;
				&amp;lt;Binding Path=&amp;quot;IsChecked&amp;quot; ElementName=&amp;quot;_rammstein&amp;quot;/&amp;gt;
				&amp;lt;Binding Path=&amp;quot;IsChecked&amp;quot; ElementName=&amp;quot;_powderfinger&amp;quot;/&amp;gt;
				&amp;lt;Binding Path=&amp;quot;IsChecked&amp;quot; ElementName=&amp;quot;_nickelback&amp;quot;/&amp;gt;
				&amp;lt;Binding Path=&amp;quot;IsChecked&amp;quot; ElementName=&amp;quot;_ministry&amp;quot;/&amp;gt;
			&amp;lt;/MultiBinding&amp;gt;
		&amp;lt;/Button.IsEnabled&amp;gt;
	&amp;lt;/Button&amp;gt;
&amp;lt;/StackPanel&amp;gt;
&lt;/pre&gt;&lt;br /&gt;In this example, the entry button is only enabled if the correct combination of bands is chosen. If you don’t like one of the good bands or if you &lt;i&gt;do&lt;/i&gt; like the sucky band, you won’t be allowed in.&lt;br /&gt;&lt;br /&gt;The actual expression has again been escaped due to its presence in XAML. Unescaped, it is simply &lt;span class="codeInline"&gt;&amp;quot;{0} &amp;amp;&amp;amp; {1} &amp;amp;&amp;amp; {3} &amp;amp;&amp;amp; !{2}&amp;quot;. An alternative approach that avoids all this escaping is to use a more long-winded syntax in the {{MultiBinding&lt;/span&gt; as follows:&lt;br /&gt;&lt;pre&gt;
&amp;lt;MultiBinding&amp;gt;
	&amp;lt;MultiBinding.Converter&amp;gt;
		&amp;lt;con:ExpressionConverterExtension&amp;gt;
			&amp;lt;con:ExpressionConverterExtension.Expression&amp;gt;
				&amp;lt;![CDATA[
				{0} &amp;amp;&amp;amp; {1} &amp;amp;&amp;amp; {3} &amp;amp;&amp;amp; !{2}
				]]&amp;gt;
			&amp;lt;/con:ExpressionConverterExtension.Expression&amp;gt;
		&amp;lt;/con:ExpressionConverterExtension&amp;gt;
	&amp;lt;/MultiBinding.Converter&amp;gt;
&amp;lt;/MultiBinding&amp;gt;
&lt;/pre&gt;&lt;br /&gt;The &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; supports a lot of C# operators and we’ve only scratched the surface of the possibilities here. Please see the API documentation for a full list of supported operators.&lt;br /&gt;&lt;a name="AWord"&gt;&lt;/a&gt;
&lt;h3&gt;A Word on the ExpressionConverter’s Parser&lt;/h3&gt;I am not going to go into detail here on the implementation of the parser behind the &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt;. For a good overview on writing a code parser, you should check out &lt;a href="http://Tommy Carlier’s series" class="externalLink"&gt;http://tommycarlier.blogspot.com/2007/05/writing-parser-overview.html&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; or any good book on compiler construction. However, I would like to point out a few things.&lt;br /&gt;&lt;br /&gt;Firstly, I did not leverage .NET’s C# CodeDom implementation to parse the expressions. This was due to the imposed security restrictions. I want the &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; to be usable in low trust applications (including Silverlight).&lt;br /&gt;&lt;br /&gt;Secondly, I did not leverage ANTLR to generate the parser because then my library would have a dependency of the .NET ANTLR runtime. This was not an option as I was trying to keep the overhead of my library to a minimum. Of course, I did experiment with both CodeDom and ANTLR prior to implementing the parser. This gave me some insights and helped me formulate goals for the parser. Some things that are not supported by my implementation are:
&lt;ul&gt;&lt;li&gt;Verbatim &lt;span class="codeInline"&gt;string&lt;/span&gt;s (i.e. strings starting with &lt;span class="codeInline"&gt;@&lt;/span&gt;).&lt;/li&gt;
&lt;li&gt;Hexadecimal or Unicode escape sequences in &lt;span class="codeInline"&gt;string&lt;/span&gt;s (but common escape sequences such as &lt;span class="codeInline"&gt;\n&lt;/span&gt; and &lt;span class="codeInline"&gt;\t&lt;/span&gt; are supported).&lt;/li&gt;
&lt;li&gt;Property accessors (e.g. an expression such as &lt;span class="codeInline"&gt;&amp;quot;{0}.Age &amp;gt; 18&amp;quot;&lt;/span&gt; will not work).&lt;/li&gt;
&lt;li&gt;Array indexers (e.g. an expression such as &lt;span class="codeInline"&gt;&amp;quot;{0}[0] &amp;gt; {0}[1]&amp;quot;&lt;/span&gt; will not work).&lt;/li&gt;
&lt;li&gt;Branching statements (and in particular, no ternary operator).&lt;/li&gt;&lt;/ul&gt;
These features were left out consciously: either because of space constraints, concerns about abuse, or concerns about the efficiency of an interpretive implementation. If you feel there is good reason to include some of these features then please let me know. If you make a strong case I may well add your feature of choice.&lt;br /&gt;&lt;br /&gt;Finally, as I hinted at above, the current implementation of the parser functions as an interpreter. It does not yet leverage .NET’s &lt;span class="codeInline"&gt;DynamicMethod&lt;/span&gt; class to produce compiled output, but it may in the future . Note that expressions given to the &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; are parsed only once. After being parsed, the same abstract syntax tree (AST) is used to evaluate the expression any number of times. Having said that, evaluation of the expressions will be slower than an otherwise equivalent implementation based on &lt;span class="codeInline"&gt;DynamicMethod&lt;/span&gt;. If this proves to be a problem in the real world then I may change the implementation.&lt;br /&gt;&lt;a name="ConverterGroup"&gt;&lt;/a&gt;
&lt;h2&gt;ConverterGroup&lt;/h2&gt;The &lt;span class="codeInline"&gt;Binding&lt;/span&gt; class only allows you to provide one converter. The &lt;span class="codeInline"&gt;ConverterGroup&lt;/span&gt; class allows you to construct a pipeline of converters that can be assigned to a &lt;span class="codeInline"&gt;Binding&lt;/span&gt;, which essentially annuls this restriction. Here’s an example:&lt;br /&gt;&lt;pre&gt;
&amp;lt;TextBox x:Name=”_textBox”/&amp;gt;
&amp;lt;Label&amp;gt;
	&amp;lt;Label.Content&amp;gt;
		&amp;lt;Binding Path=”Text” ElementName=”_textBox”&amp;gt;
			&amp;lt;Binding.Converter&amp;gt;
				&amp;lt;con:ConverterGroup&amp;gt;
					&amp;lt;con:CaseConverter Casing=”Upper”/&amp;gt;
					&amp;lt;con:FormatConverter FormatString=”In uppercase, you entered ‘{0}’.”/&amp;gt;
				&amp;lt;/con:ConverterGroup&amp;gt;
			&amp;lt;/Binding.Converter&amp;gt;
		&amp;lt;/Binding&amp;gt;
	&amp;lt;/Label.Content&amp;gt;
&amp;lt;/Label&amp;gt;
&lt;/pre&gt;&lt;br /&gt;In this example, any input in the &lt;span class="codeInline"&gt;TextBox&lt;/span&gt; is first converted to uppercase with the &lt;span class="codeInline"&gt;CaseConverter&lt;/span&gt; and then formatted via the &lt;span class="codeInline"&gt;FormatConverter&lt;/span&gt;. If all converters in the pipeline support backward conversions (not so in this case) then the &lt;span class="codeInline"&gt;ConverterGroup&lt;/span&gt; will also support backwards conversions.&lt;br /&gt;&lt;a name="MultiConverterGroup"&gt;&lt;/a&gt;
&lt;h2&gt;MultiConverterGroup&lt;/h2&gt;The &lt;span class="codeInline"&gt;MultiConverterGroup&lt;/span&gt; class has the same goals as the &lt;span class="codeInline"&gt;ConverterGroup&lt;/span&gt; class except that it is an implementation of &lt;span class="codeInline"&gt;IMultiValueConverter&lt;/span&gt; rather than &lt;span class="codeInline"&gt;IValueConverter&lt;/span&gt;. It works with a pipeline of steps (represented by instances of &lt;span class="codeInline"&gt;MultiConverterGroupStep&lt;/span&gt;). Each step can have any number of multi-value converters in it. The output from each step is the combined output from each converter in the step. This output is then fed into the next step.&lt;br /&gt;&lt;br /&gt;If your head hurts from reading that (mine sure does after writing it) then perhaps this diagram will help:&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=wpfconverters&amp;DownloadId=25507" alt="MultiConverterGroup.png" title="MultiConverterGroup.png" /&gt;&lt;br /&gt;The above example defines three steps in the conversion pipeline. The &lt;span class="codeInline"&gt;MultiConverterGroup&lt;/span&gt; combines objects output from the converters in &lt;i&gt;Step 1&lt;/i&gt; and uses that as the input to &lt;i&gt;Step 2&lt;/i&gt;. Similarly, the output from &lt;i&gt;Step 2&lt;/i&gt; is fed into &lt;i&gt;Step 3&lt;/i&gt;. The XAML for this example would look like this:&lt;br /&gt;&lt;pre&gt;
&amp;lt;con:MultiConverterGroup&amp;gt;
	&amp;lt;MultiConverterGroupStep&amp;gt;
		&amp;lt;Converter1/&amp;gt;
		&amp;lt;Converter2/&amp;gt;
		&amp;lt;Converter3/&amp;gt;
	&amp;lt;/MultiConverterGroupStep&amp;gt;
	&amp;lt;MultiConverterGroupStep&amp;gt;
		&amp;lt;Converter4/&amp;gt;
		&amp;lt;Converter5/&amp;gt;
		&amp;lt;Converter6/&amp;gt;
	&amp;lt;/MultiConverterGroupStep&amp;gt;
	&amp;lt;MultiConverterGroupStep&amp;gt;
		&amp;lt;Converter7/&amp;gt;
	&amp;lt;/MultiConverterGroupStep&amp;gt;
&amp;lt;/con:MultiConverterGroup&amp;gt;
&lt;/pre&gt;&lt;br /&gt;Note that the last step must always have exactly one converter, which makes sense because at the end of the day the pipeline needs to produce a single value. If you violate this constraint, you’ll get an exception.&lt;br /&gt;&lt;br /&gt;So that covers forward conversions, but what about backward conversions? If you examine the diagram, you’ll realize that a backward conversion starts at the bottom and heads toward the top, but could take one of many paths. In theory, if all converters are implemented correctly and they all support backward conversions, then any path from the bottom to the top with the same input would yield the same output.&lt;br /&gt;&lt;br /&gt;In practice, the &lt;span class="codeInline"&gt;MultiConverterGroup&lt;/span&gt; solves this ambiguity by leaning on the left-hand side of the path when converting backwards. In the example, it will pass output from &lt;span class="codeInline"&gt;Converter7&lt;/span&gt; into &lt;span class="codeInline"&gt;Converter4&lt;/span&gt; and then pass the output from that into &lt;span class="codeInline"&gt;Converter1&lt;/span&gt;.&lt;br /&gt;&lt;a name="TypeConverter"&gt;&lt;/a&gt;
&lt;h2&gt;TypeConverter&lt;/h2&gt;The &lt;span class="codeInline"&gt;TypeConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;TypeConverterExtension&lt;/span&gt; classes provide the ability to convert input values to different types. It is essentially a public implementation of the &lt;span class="codeInline"&gt;internal DefaultValueConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;SystemConvertConverter&lt;/span&gt; BCL types. It is useful in coercing a value to required type during a pipeline conversion using &lt;span class="codeInline"&gt;ConverterGroup&lt;/span&gt;. Using it is straightforward:&lt;br /&gt;&lt;pre&gt;
&amp;lt;Label&amp;gt;
	&amp;lt;Label.Content&amp;gt;
		&amp;lt;Binding Path=”Dob”&amp;gt;
			&amp;lt;Binding.Converter&amp;gt;
				&amp;lt;con:ConverterGroup&amp;gt;
					&amp;lt;con:TypeConverter TargetType=”{x:Type sys:DateTime}”/&amp;gt;
					&amp;lt;con:DateTimeConverter TargetKind=”Local”/&amp;gt;
				&amp;lt;/con:ConverterGroup&amp;gt;
			&amp;lt;/Binding.Converter&amp;gt;
		&amp;lt;/Binding&amp;gt;
	&amp;lt;/Label.Content&amp;gt;
&amp;lt;/Label&amp;gt;
&lt;/pre&gt;&lt;br /&gt;In this highly fabricated example, there is a &lt;span class="codeInline"&gt;Dob&lt;/span&gt; property that is a &lt;span class="codeInline"&gt;string&lt;/span&gt; when it really should be a &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;. A &lt;span class="codeInline"&gt;TypeConverter&lt;/span&gt; is used to convert the &lt;span class="codeInline"&gt;string&lt;/span&gt; to a &lt;span class="codeInline"&gt;DateTime&lt;/span&gt; prior to feeding it into a &lt;span class="codeInline"&gt;DateTimeConverter&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The &lt;span class="codeInline"&gt;TypeConverter&lt;/span&gt; will first attempt to convert data by way of an &lt;span class="codeInline"&gt;IConvertible&lt;/span&gt; implementation. If the value does not implement &lt;span class="codeInline"&gt;IConvertible&lt;/span&gt; then an attempt will be made to use any &lt;span class="codeInline"&gt;System.ComponentModel.TypeConverter&lt;/span&gt; implementation type for the class. If all attempts to convert the value fail, &lt;span class="codeInline"&gt;DependencyProperty.UnsetValue&lt;/span&gt; will be returned.&lt;br /&gt;&lt;a name="DataBindingAndConverters"&gt;&lt;/a&gt;
&lt;h1&gt;Data Binding and Converters&lt;/h1&gt;The observant among you may have noticed that my converter implementations inherit from &lt;span class="codeInline"&gt;DependencyObject&lt;/span&gt; and define their properties as &lt;span class="codeInline"&gt;DependencyProperty&lt;/span&gt;s. You may see this and try something like:&lt;br /&gt;&lt;pre&gt;
&amp;lt;Label&amp;gt;
	&amp;lt;Label.Content&amp;gt;
		&amp;lt;Binding Path=”Name”&amp;gt;
			&amp;lt;Binding.Converter&amp;gt;
				&amp;lt;con:CaseConverter Casing=”{Binding Casing}”/&amp;gt;
			&amp;lt;/Binding.Converter&amp;gt;
		&amp;lt;/Binding&amp;gt;
	&amp;lt;/Label.Content&amp;gt;
&amp;lt;/Label&amp;gt;
&lt;/pre&gt;&lt;br /&gt;Alas, this won’t work, at least with the current version of WPF. You’ll get an error:&lt;br /&gt;&lt;pre&gt;
Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Casing; DataItem=null; target element is &amp;#39;CaseConverter&amp;#39;
&lt;/pre&gt;&lt;br /&gt;So why did I bother with &lt;span class="codeInline"&gt;DependencyObject&lt;/span&gt;s? Well, if you really need to bind properties on your converters you can use &lt;a href="http://Josh Smith’s virtual branch technique" class="externalLink"&gt;http://www.codeproject.com/WPF/AttachingVirtualBranches.asp&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; to do so.&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>kentcb</author><pubDate>Wed, 24 Feb 2010 19:36:10 GMT</pubDate><guid isPermaLink="false">Updated Wiki: User Documentation 20100224073610P</guid></item><item><title>Updated Wiki: User Documentation</title><link>http://wpfconverters.codeplex.com/wikipage?title=User Documentation&amp;version=3</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;User Documentation&lt;/h1&gt;&lt;h2&gt;Contents&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="#Overview"&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#SetUp"&gt;Set Up&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#Converters"&gt;Converters&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="#CaseConverter"&gt;CaseConverter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#FormatConverter"&gt;FormatConverter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#DateTimeConverter"&gt;DateTimeConverter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#MapConverter"&gt;MapConverter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ExpressionConverter"&gt;ExpressionConverter&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="#AWord"&gt;A Word on the ExpressionConverter&amp;#8217;s Parser&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ConverterGroup"&gt;ConverterGroup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#MultiConverterGroup"&gt;MultiConverterGroup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#TypeConverter"&gt;TypeConverter&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#DataBindingAndConverters"&gt;Data Binding and Converters&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;a name="Overview"&gt;&lt;/a&gt;
&lt;h1&gt;Overview&lt;/h1&gt;WPF’s &lt;span class="codeInline"&gt;Binding&lt;/span&gt; and &lt;span class="codeInline"&gt;MultiBinding&lt;/span&gt; types define a &lt;span class="codeInline"&gt;Converter&lt;/span&gt; property that allows you to provide a converter that will be used during the binding process. If you don’t explicitly specify a value converter, WPF will use its built-in primitive ones behind the scenes (such as &lt;span class="codeInline"&gt;DefaultValueConverter&lt;/span&gt;, &lt;span class="codeInline"&gt;ObjectTargetConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;SystemConvertConverter&lt;/span&gt; – all are &lt;span class="codeInline"&gt;internal&lt;/span&gt; types defined in the &lt;span class="codeInline"&gt;MS.Internal.Data&lt;/span&gt; namespace).&lt;br /&gt;&lt;br /&gt;If you &lt;i&gt;do&lt;/i&gt; specify a value converter, WPF will invoke methods on your converter during the data binding process. These methods are:
&lt;ul&gt;&lt;li&gt;&lt;span class="codeInline"&gt;Convert()&lt;/span&gt;. Called to convert a value when propagating it from the binding source to the binding target.&lt;/li&gt;
&lt;li&gt;&lt;span class="codeInline"&gt;ConvertBack()&lt;/span&gt;. Called to convert a value when propagating it from the binding target to the binding source.&lt;/li&gt;&lt;/ul&gt;
The following diagram depicts this process:&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=wpfconverters&amp;DownloadId=25506" alt="Binding.png" title="Binding.png" /&gt;&lt;br /&gt;What I have found whilst working with WPF is that value converters (shown in the middle of the above diagram) are often needed to solve similar problems. This article and code library seeks to address the most common converter requirements and alleviate the need for a lot of custom converter code in any WPF application.&lt;br /&gt;&lt;br /&gt;The following converters are included in this project:&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt; Name &lt;/th&gt;&lt;th&gt; Supports Singular Conversions &lt;/th&gt;&lt;th&gt; Supports Multiple Conversions &lt;/th&gt;&lt;th&gt; Supports Forward Conversions &lt;/th&gt;&lt;th&gt; Supports Backward Conversions &lt;/th&gt;&lt;th&gt; Has Markup Extension &lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#CaseConverter"&gt;CaseConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#ConverterGroup"&gt;ConverterGroup&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes (1) &lt;/td&gt;&lt;td&gt; Yes (2) &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#DateTimeConverter"&gt;DateTimeConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#ExpressionConverter"&gt;ExpressionConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes (3) &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#FormatConverter"&gt;FormatConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes (4) &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#MapConverter"&gt;MapConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#MultiConverterGroup"&gt;MultiConverterGroup&lt;/a&gt; &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes (5) &lt;/td&gt;&lt;td&gt; Yes (6) &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;a href="#TypeConverter"&gt;TypeConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;ol&gt;&lt;li&gt;Assuming all child converters support forward conversions.&lt;/li&gt;
&lt;li&gt;Assuming all child converters support backward conversions.&lt;/li&gt;
&lt;li&gt;In fact, this is the only way to use the expression converter.&lt;/li&gt;
&lt;li&gt;Only for singular conversions.&lt;/li&gt;
&lt;li&gt;Assuming all child converters support forward conversions.&lt;/li&gt;
&lt;li&gt;Assuming all child converters support backward conversions.&lt;/li&gt;&lt;/ol&gt;
&lt;a name="UsingWPFConverters"&gt;&lt;/a&gt;
&lt;h1&gt;Using WPF Converters&lt;/h1&gt;To use WPF Converters, you need to:
&lt;ol&gt;&lt;li&gt;Add a reference to the &lt;i&gt;Kent.Boogaart.Converters.dll&lt;/i&gt; assembly.&lt;/li&gt;
&lt;li&gt;Declare an XML-&amp;gt;CLR namespace mapping to &lt;i&gt;http://schemas.kent.boogaart.com/converters&lt;/i&gt;.&lt;/li&gt;&lt;/ol&gt;
&lt;br /&gt;All the examples on this page assume a declaration such as:&lt;br /&gt;&lt;pre&gt;
&amp;lt;Window xmlns:con=&amp;quot;http://schemas.kent.boogaart.com/converters&amp;quot;&amp;gt;
&lt;/pre&gt;&lt;br /&gt;&lt;a name="Converters"&gt;&lt;/a&gt;
&lt;h1&gt;Converters&lt;/h1&gt;In this section, each of the converters will be discussed in some detail. Note that there are further usage examples available in the API documentation.&lt;br /&gt;&lt;a name="CaseConverter"&gt;&lt;/a&gt;
&lt;h2&gt;CaseConverter&lt;/h2&gt;The &lt;span class="codeInline"&gt;CaseConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;CaseConverterExtension&lt;/span&gt; classes allow you to convert a &lt;span class="codeInline"&gt;string&lt;/span&gt; to upper or lower case. They accept a single parameter: &lt;span class="codeInline"&gt;Casing&lt;/span&gt;, which is used to specify the desired case for the resultant &lt;span class="codeInline"&gt;string&lt;/span&gt;. It is very simple to use, as the following example demonstrates:&lt;br /&gt;&lt;pre&gt;
&amp;lt;TextBox x:Name=&amp;quot;_textBox&amp;quot;/&amp;gt;
&amp;lt;Label Content=&amp;quot;{Binding Text, ElementName=_textBox, Converter={con:CaseConverter Upper&lt;/pre&gt;&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;Label Content=&amp;quot;{Binding Text, ElementName=_textBox, Converter={con:CaseConverter Lower}}&amp;quot;/&amp;gt;&lt;br /&gt;}}&lt;br /&gt;Anything typed in the &lt;span class="codeInline"&gt;TextBox&lt;/span&gt; will be displayed in uppercase in the first &lt;span class="codeInline"&gt;Label&lt;/span&gt;, and lowercase in the second.&lt;br /&gt;&lt;a name="FormatConverter"&gt;&lt;/a&gt;
&lt;h2&gt;FormatConverter&lt;/h2&gt;The &lt;span class="codeInline"&gt;FormatConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;FormatConverterExtension&lt;/span&gt; classes allow you to convert any number of &lt;span class="codeInline"&gt;object&lt;/span&gt;s to a &lt;span class="codeInline"&gt;string&lt;/span&gt; by using .NET’s standard formatting capabilities. They accept a single parameter: &lt;span class="codeInline"&gt;FormatString&lt;/span&gt;, which defines the format for the resultant &lt;span class="codeInline"&gt;string&lt;/span&gt;.&lt;br /&gt;When binding to a single value it can be used as follows:&lt;br /&gt;&lt;pre&gt;
&amp;lt;TextBox x:Name=&amp;quot;_textBox&amp;quot;/&amp;gt;
&amp;lt;Label Content=&amp;quot;{Binding Text, ElementName=_textBox, Converter={con:FormatConverter {}Your name is {0&lt;/pre&gt;}&amp;quot;/&amp;gt;&lt;br /&gt;}}&lt;br /&gt;Note how the format &lt;span class="codeInline"&gt;string&lt;/span&gt; passed to the &lt;span class="codeInline"&gt;FormatConverter&lt;/span&gt; is escaped with &amp;quot;{}&amp;quot;, which is necessary because it contains the &amp;quot; and &amp;quot; characters within it. The format &lt;span class="codeInline"&gt;string&lt;/span&gt; on its own is simply &amp;quot;Your name is {0}&amp;quot;.&lt;br /&gt;Binding to multiple values looks like this:&lt;br /&gt;&lt;pre&gt;
&amp;lt;TextBox x:Name=&amp;quot;_textBox1&amp;quot;/&amp;gt;
&amp;lt;TextBox x:Name=&amp;quot;_textBox2&amp;quot;/&amp;gt;
&amp;lt;Label&amp;gt;
	&amp;lt;Label.Content&amp;gt;
		&amp;lt;MultiBinding Converter=&amp;quot;{con:FormatConverter {}You said {0} and {1}.}&amp;quot;&amp;gt;
			&amp;lt;Binding Path=&amp;quot;Text&amp;quot; ElementName=&amp;quot;_textBox1&amp;quot;/&amp;gt;
			&amp;lt;Binding Path=&amp;quot;Text&amp;quot; ElementName=&amp;quot;_textBox2&amp;quot;/&amp;gt;
		&amp;lt;/MultiBinding&amp;gt;
	&amp;lt;/Label.Content&amp;gt;
&amp;lt;/Label&amp;gt;
&lt;/pre&gt;&lt;br /&gt;&lt;a name="DateTimeConverter"&gt;&lt;/a&gt;
&lt;h2&gt;DateTimeConverter&lt;/h2&gt;The &lt;span class="codeInline"&gt;DateTimeConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;DateTimeConverterExtension&lt;/span&gt; classes allow you to perform specialized conversions on &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s during data binding. Using these classes, you can do any of the following:
&lt;ul&gt;&lt;li&gt;Convert between different kinds of &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s (e.g. convert between UTC and local time).&lt;/li&gt;
&lt;li&gt;Convert between different kinds of &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s without changing the underlying &lt;span class="codeInline"&gt;DateTime&lt;/span&gt; value (i.e. convert by using &lt;span class="codeInline"&gt;DateTime.SpecifyKind()&lt;/span&gt; instead of &lt;span class="codeInline"&gt;ToLocalTime()&lt;/span&gt; or &lt;span class="codeInline"&gt;ToUniversalTime()&lt;/span&gt;).&lt;/li&gt;
&lt;li&gt;Adjust &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s during conversion by adding a &lt;span class="codeInline"&gt;TimeSpan&lt;/span&gt; to them.&lt;/li&gt;&lt;/ul&gt;
The &lt;span class="codeInline"&gt;DateTimeConverter&lt;/span&gt; supports both forward and backwards conversions. This allows you, for example, to store &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s in UTC format in your business objects but convert them to local time prior to using them in your interface. The following example shows how you could achieve this (and assumes the existence of a WPF &lt;span class="codeInline"&gt;DatePicker&lt;/span&gt; class):&lt;br /&gt;&lt;pre&gt;
&amp;lt;DatePicker Value=&amp;quot;{Binding StartDate, Converter={con:DateTimeConverter TargetKind=Local, SourceKind=Utc&lt;/pre&gt;&amp;quot;/&amp;gt;&lt;br /&gt;}}&lt;br /&gt;&lt;a name="MapConverter"&gt;&lt;/a&gt;
&lt;h2&gt;MapConverter&lt;/h2&gt;The &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; class (which has no corresponding markup extension) can be used to map one set of values to another. This is an extremely useful converter that has many use cases. Here are some examples:
&lt;ul&gt;&lt;li&gt;Converting enumeration values to human-readable strings prior to display.&lt;/li&gt;
&lt;li&gt;Converting between &lt;span class="codeInline"&gt;bool&lt;/span&gt; values and &lt;span class="codeInline"&gt;Visibility&lt;/span&gt; enumeration values.&lt;/li&gt;
&lt;li&gt;Converting between &lt;span class="codeInline"&gt;bool&lt;/span&gt; values and an &lt;span class="codeInline"&gt;ImageSource&lt;/span&gt; so the user sees a tick or a cross depending on the &lt;span class="codeInline"&gt;bool&lt;/span&gt; value.&lt;/li&gt;&lt;/ul&gt;
The &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; works by using a collection of &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; objects. Each &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; object specifies a value to map &lt;i&gt;from&lt;/i&gt; and a value to map &lt;i&gt;to&lt;/i&gt;. The same &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; objects are used both for forward conversions and backward conversions.&lt;br /&gt;If no relevant &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; object can be found during a conversion, the &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; uses its &lt;span class="codeInline"&gt;FallbackBehavior&lt;/span&gt; property to decide what to do. You can tell it to either return &lt;span class="codeInline"&gt;DependencyProperty.UnsetValue&lt;/span&gt; or to return the value it was asked to convert.&lt;br /&gt;An example should make this all clear:&lt;br /&gt;&lt;pre&gt;
&amp;lt;Label&amp;gt;
	&amp;lt;Label.Content&amp;gt;
		&amp;lt;Binding Path=&amp;quot;Gender&amp;quot;&amp;gt;
			&amp;lt;Binding.Converter&amp;gt;
				&amp;lt;con:MapConverter&amp;gt;
					&amp;lt;con:Mapping From=&amp;quot;{x:Static Gender.Male}&amp;quot; To=&amp;quot;Guy&amp;quot;/&amp;gt;
					&amp;lt;con:Mapping From=&amp;quot;{x:Static Gender.Female}&amp;quot; To=&amp;quot;Gal&amp;quot;/&amp;gt;
				&amp;lt;/con:MapConverter&amp;gt;
			&amp;lt;/Binding.Converter&amp;gt;
		&amp;lt;/Binding&amp;gt;
	&amp;lt;/Label.Content&amp;gt;
&amp;lt;/Label&amp;gt;
&lt;/pre&gt;&lt;br /&gt;This example uses a &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; to convert from members in a &lt;span class="codeInline"&gt;Gender&lt;/span&gt; enumeration to either &amp;quot;Guy&amp;quot; or &amp;quot;Gal&amp;quot;. Now suppose that the &lt;span class="codeInline"&gt;Gender&lt;/span&gt; enumeration also defines a value of &lt;span class="codeInline"&gt;Unknown&lt;/span&gt; (a wise move in these modern times). The above mapping won’t successfully convert values of &lt;span class="codeInline"&gt;Unknown&lt;/span&gt; – it will just return &lt;span class="codeInline"&gt;DependencyProperty.UnsetValue&lt;/span&gt; instead.&lt;br /&gt;If you want unknown genders to display as &amp;quot;Unknown&amp;quot; you can either add another &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; or just tell the &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; to return the original value if it cannot map the value it is given:&lt;br /&gt;&lt;pre&gt;
&amp;lt;con:MapConverter FallbackBehavior=&amp;quot;ReturnOriginalValue&amp;quot;&amp;gt;
	&amp;lt;con:Mapping From=&amp;quot;{x:Static Gender.Male}&amp;quot; To=&amp;quot;Guy&amp;quot;/&amp;gt;
	&amp;lt;con:Mapping From=&amp;quot;{x:Static Gender.Female}&amp;quot; To=&amp;quot;Gal&amp;quot;/&amp;gt;
&amp;lt;/con:MapConverter&amp;gt;
&lt;/pre&gt;&lt;br /&gt;A &lt;span class="codeInline"&gt;FallbackBehavior&lt;/span&gt; of &lt;span class="codeInline"&gt;ReturnOriginalValue&lt;/span&gt; is extremely useful where you only want to map a subset of the total possible values.&lt;br /&gt;&lt;a name="ExpressionConverter"&gt;&lt;/a&gt;
&lt;h2&gt;ExpressionConverter&lt;/h2&gt;The &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;ExpressionConverterExtension&lt;/span&gt; classes allow you to convert one or more bound values by running them through a C#-like expression. The expression uses placeholders of the form &lt;span class="codeInline"&gt;{x&lt;/span&gt;} to demarcate bound arguments, where &lt;span class="codeInline"&gt;x&lt;/span&gt; is the argument number starting at zero.&lt;br /&gt;&lt;br /&gt;Let’s start with something simple:&lt;br /&gt;&lt;pre&gt;
&amp;lt;Canvas&amp;gt;
	&amp;lt;Slider x:Name=&amp;quot;_slider&amp;quot; Width=&amp;quot;300&amp;quot; Minimum=&amp;quot;1&amp;quot; Maximum=&amp;quot;100&amp;quot;/&amp;gt;
	&amp;lt;Rectangle Canvas.Top=&amp;quot;20&amp;quot; Fill=&amp;quot;Red&amp;quot; Width=&amp;quot;100&amp;quot; Height=&amp;quot;{Binding Value, ElementName=_slider}&amp;quot;/&amp;gt;
	&amp;lt;Rectangle Canvas.Top=&amp;quot;100&amp;quot; Fill=&amp;quot;Blue&amp;quot; Width=&amp;quot;100&amp;quot; Height=&amp;quot;{Binding Value, ElementName=_slider, Converter={con:ExpressionConverter {}{0} * 2} }&amp;quot;/&amp;gt;
&amp;lt;/Canvas&amp;gt;
&lt;/pre&gt;&lt;br /&gt;In this example, the value of the &lt;span class="codeInline"&gt;Slider&lt;/span&gt; dictates the height of the first rectangle. It also dictates the height of the second rectangle, but an &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; is used to double the value first.&lt;br /&gt;&lt;br /&gt;Notice how the expression passed to the &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; is escaped with &amp;quot;{}&amp;quot;. As with the FormatConverter, this is necessary because it includes the &amp;quot; and &amp;quot; characters. The expression on its own is simply &lt;span class="codeInline"&gt;&amp;quot;{0} * 2&amp;quot;&lt;/span&gt;. In English, this means &amp;quot;multiply the first argument by two&amp;quot;.&lt;br /&gt;&lt;br /&gt;Now, let’s do something a little more complex:&lt;br /&gt;&lt;pre&gt;
&amp;lt;StackPanel x:Name=&amp;quot;_panel&amp;quot;&amp;gt;
	&amp;lt;Label&amp;gt;What bands do you like?&amp;lt;/Label&amp;gt;
	&amp;lt;CheckBox x:Name=&amp;quot;_rammstein&amp;quot;&amp;gt;Rammstein&amp;lt;/Label&amp;gt;
	&amp;lt;CheckBox x:Name=&amp;quot;_powderfinger&amp;quot;&amp;gt;Powderfinger&amp;lt;/Label&amp;gt;
	&amp;lt;CheckBox x:Name=&amp;quot;_nickelback&amp;quot;&amp;gt;Nickelback&amp;lt;/Label&amp;gt;
	&amp;lt;CheckBox x:Name=&amp;quot;_ministry&amp;quot;&amp;gt;Ministry&amp;lt;/Label&amp;gt;
	&amp;lt;Button Content=&amp;quot;Let me in!&amp;quot;&amp;gt;
		&amp;lt;Button.IsEnabled&amp;gt;
			&amp;lt;MultiBinding Converter=&amp;quot;{ExpressionConverter {}{0} &amp;amp;amp;&amp;amp;amp; {1} &amp;amp;amp;&amp;amp;amp; {3} &amp;amp;amp;&amp;amp;amp; !{2&lt;/pre&gt;&amp;quot;&amp;gt;&lt;br /&gt;				&amp;lt;Binding Path=&amp;quot;IsChecked&amp;quot; ElementName=&amp;quot;_rammstein&amp;quot;/&amp;gt;&lt;br /&gt;				&amp;lt;Binding Path=&amp;quot;IsChecked&amp;quot; ElementName=&amp;quot;_powderfinger&amp;quot;/&amp;gt;&lt;br /&gt;				&amp;lt;Binding Path=&amp;quot;IsChecked&amp;quot; ElementName=&amp;quot;_nickelback&amp;quot;/&amp;gt;&lt;br /&gt;				&amp;lt;Binding Path=&amp;quot;IsChecked&amp;quot; ElementName=&amp;quot;_ministry&amp;quot;/&amp;gt;&lt;br /&gt;			&amp;lt;/MultiBinding&amp;gt;&lt;br /&gt;		&amp;lt;/Button.IsEnabled&amp;gt;&lt;br /&gt;	&amp;lt;/Button&amp;gt;&lt;br /&gt;&amp;lt;/StackPanel&amp;gt;&lt;br /&gt;}}&lt;br /&gt;In this example, the entry button is only enabled if the correct combination of bands is chosen. If you don’t like one of the good bands or if you &lt;i&gt;do&lt;/i&gt; like the sucky band, you won’t be allowed in.&lt;br /&gt;&lt;br /&gt;The actual expression has again been escaped due to its presence in XAML. Unescaped, it is simply &lt;span class="codeInline"&gt;&amp;quot;{0} &amp;amp;&amp;amp; {1} &amp;amp;&amp;amp; {3} &amp;amp;&amp;amp; !{2}&amp;quot;. An alternative approach that avoids all this escaping is to use a more long-winded syntax in the {{MultiBinding&lt;/span&gt; as follows:&lt;br /&gt;&lt;pre&gt;
&amp;lt;MultiBinding&amp;gt;
	&amp;lt;MultiBinding.Converter&amp;gt;
		&amp;lt;con:ExpressionConverterExtension&amp;gt;
			&amp;lt;con:ExpressionConverterExtension.Expression&amp;gt;
				&amp;lt;![CDATA[
				{0} &amp;amp;&amp;amp; {1} &amp;amp;&amp;amp; {3} &amp;amp;&amp;amp; !{2}
				]]&amp;gt;
			&amp;lt;/con:ExpressionConverterExtension.Expression&amp;gt;
		&amp;lt;/con:ExpressionConverterExtension&amp;gt;
	&amp;lt;/MultiBinding.Converter&amp;gt;
&amp;lt;/MultiBinding&amp;gt;
&lt;/pre&gt;&lt;br /&gt;The &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; supports a lot of C# operators and we’ve only scratched the surface of the possibilities here. Please see the API documentation for a full list of supported operators.&lt;br /&gt;&lt;a name="AWord"&gt;&lt;/a&gt;
&lt;h3&gt;A Word on the ExpressionConverter’s Parser&lt;/h3&gt;I am not going to go into detail here on the implementation of the parser behind the &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt;. For a good overview on writing a code parser, you should check out &lt;a href="http://Tommy Carlier’s series" class="externalLink"&gt;http://tommycarlier.blogspot.com/2007/05/writing-parser-overview.html&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; or any good book on compiler construction. However, I would like to point out a few things.&lt;br /&gt;&lt;br /&gt;Firstly, I did not leverage .NET’s C# CodeDom implementation to parse the expressions. This was due to the imposed security restrictions. I want the &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; to be usable in low trust applications (including Silverlight).&lt;br /&gt;&lt;br /&gt;Secondly, I did not leverage ANTLR to generate the parser because then my library would have a dependency of the .NET ANTLR runtime. This was not an option as I was trying to keep the overhead of my library to a minimum. Of course, I did experiment with both CodeDom and ANTLR prior to implementing the parser. This gave me some insights and helped me formulate goals for the parser. Some things that are not supported by my implementation are:
&lt;ul&gt;&lt;li&gt;Verbatim &lt;span class="codeInline"&gt;string&lt;/span&gt;s (i.e. strings starting with &lt;span class="codeInline"&gt;@&lt;/span&gt;).&lt;/li&gt;
&lt;li&gt;Hexadecimal or Unicode escape sequences in &lt;span class="codeInline"&gt;string&lt;/span&gt;s (but common escape sequences such as &lt;span class="codeInline"&gt;\n&lt;/span&gt; and &lt;span class="codeInline"&gt;\t&lt;/span&gt; are supported).&lt;/li&gt;
&lt;li&gt;Property accessors (e.g. an expression such as &lt;span class="codeInline"&gt;&amp;quot;{0}.Age &amp;gt; 18&amp;quot;&lt;/span&gt; will not work).&lt;/li&gt;
&lt;li&gt;Array indexers (e.g. an expression such as &lt;span class="codeInline"&gt;&amp;quot;{0}[0] &amp;gt; {0}[1]&amp;quot;&lt;/span&gt; will not work).&lt;/li&gt;
&lt;li&gt;Branching statements (and in particular, no ternary operator).&lt;/li&gt;&lt;/ul&gt;
These features were left out consciously: either because of space constraints, concerns about abuse, or concerns about the efficiency of an interpretive implementation. If you feel there is good reason to include some of these features then please let me know. If you make a strong case I may well add your feature of choice.&lt;br /&gt;&lt;br /&gt;Finally, as I hinted at above, the current implementation of the parser functions as an interpreter. It does not yet leverage .NET’s &lt;span class="codeInline"&gt;DynamicMethod&lt;/span&gt; class to produce compiled output, but it may in the future . Note that expressions given to the &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; are parsed only once. After being parsed, the same abstract syntax tree (AST) is used to evaluate the expression any number of times. Having said that, evaluation of the expressions will be slower than an otherwise equivalent implementation based on &lt;span class="codeInline"&gt;DynamicMethod&lt;/span&gt;. If this proves to be a problem in the real world then I may change the implementation.&lt;br /&gt;&lt;a name="ConverterGroup"&gt;&lt;/a&gt;
&lt;h2&gt;ConverterGroup&lt;/h2&gt;The &lt;span class="codeInline"&gt;Binding&lt;/span&gt; class only allows you to provide one converter. The &lt;span class="codeInline"&gt;ConverterGroup&lt;/span&gt; class allows you to construct a pipeline of converters that can be assigned to a &lt;span class="codeInline"&gt;Binding&lt;/span&gt;, which essentially annuls this restriction. Here’s an example:&lt;br /&gt;&lt;pre&gt;
&amp;lt;TextBox x:Name=”_textBox”/&amp;gt;
&amp;lt;Label&amp;gt;
	&amp;lt;Label.Content&amp;gt;
		&amp;lt;Binding Path=”Text” ElementName=”_textBox”&amp;gt;
			&amp;lt;Binding.Converter&amp;gt;
				&amp;lt;con:ConverterGroup&amp;gt;
					&amp;lt;con:CaseConverter Casing=”Upper”/&amp;gt;
					&amp;lt;con:FormatConverter FormatString=”In uppercase, you entered ‘{0}’.”/&amp;gt;
				&amp;lt;/con:ConverterGroup&amp;gt;
			&amp;lt;/Binding.Converter&amp;gt;
		&amp;lt;/Binding&amp;gt;
	&amp;lt;/Label.Content&amp;gt;
&amp;lt;/Label&amp;gt;
&lt;/pre&gt;&lt;br /&gt;In this example, any input in the &lt;span class="codeInline"&gt;TextBox&lt;/span&gt; is first converted to uppercase with the &lt;span class="codeInline"&gt;CaseConverter&lt;/span&gt; and then formatted via the &lt;span class="codeInline"&gt;FormatConverter&lt;/span&gt;. If all converters in the pipeline support backward conversions (not so in this case) then the &lt;span class="codeInline"&gt;ConverterGroup&lt;/span&gt; will also support backwards conversions.&lt;br /&gt;&lt;a name="MultiConverterGroup"&gt;&lt;/a&gt;
&lt;h2&gt;MultiConverterGroup&lt;/h2&gt;The &lt;span class="codeInline"&gt;MultiConverterGroup&lt;/span&gt; class has the same goals as the &lt;span class="codeInline"&gt;ConverterGroup&lt;/span&gt; class except that it is an implementation of &lt;span class="codeInline"&gt;IMultiValueConverter&lt;/span&gt; rather than &lt;span class="codeInline"&gt;IValueConverter&lt;/span&gt;. It works with a pipeline of steps (represented by instances of &lt;span class="codeInline"&gt;MultiConverterGroupStep&lt;/span&gt;). Each step can have any number of multi-value converters in it. The output from each step is the combined output from each converter in the step. This output is then fed into the next step.&lt;br /&gt;&lt;br /&gt;If your head hurts from reading that (mine sure does after writing it) then perhaps this diagram will help:&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=wpfconverters&amp;DownloadId=25507" alt="MultiConverterGroup.png" title="MultiConverterGroup.png" /&gt;&lt;br /&gt;The above example defines three steps in the conversion pipeline. The &lt;span class="codeInline"&gt;MultiConverterGroup&lt;/span&gt; combines objects output from the converters in &lt;i&gt;Step 1&lt;/i&gt; and uses that as the input to &lt;i&gt;Step 2&lt;/i&gt;. Similarly, the output from &lt;i&gt;Step 2&lt;/i&gt; is fed into &lt;i&gt;Step 3&lt;/i&gt;. The XAML for this example would look like this:&lt;br /&gt;&lt;pre&gt;
&amp;lt;con:MultiConverterGroup&amp;gt;
	&amp;lt;MultiConverterGroupStep&amp;gt;
		&amp;lt;Converter1/&amp;gt;
		&amp;lt;Converter2/&amp;gt;
		&amp;lt;Converter3/&amp;gt;
	&amp;lt;/MultiConverterGroupStep&amp;gt;
	&amp;lt;MultiConverterGroupStep&amp;gt;
		&amp;lt;Converter4/&amp;gt;
		&amp;lt;Converter5/&amp;gt;
		&amp;lt;Converter6/&amp;gt;
	&amp;lt;/MultiConverterGroupStep&amp;gt;
	&amp;lt;MultiConverterGroupStep&amp;gt;
		&amp;lt;Converter7/&amp;gt;
	&amp;lt;/MultiConverterGroupStep&amp;gt;
&amp;lt;/con:MultiConverterGroup&amp;gt;
&lt;/pre&gt;&lt;br /&gt;Note that the last step must always have exactly one converter, which makes sense because at the end of the day the pipeline needs to produce a single value. If you violate this constraint, you’ll get an exception.&lt;br /&gt;&lt;br /&gt;So that covers forward conversions, but what about backward conversions? If you examine the diagram, you’ll realize that a backward conversion starts at the bottom and heads toward the top, but could take one of many paths. In theory, if all converters are implemented correctly and they all support backward conversions, then any path from the bottom to the top with the same input would yield the same output.&lt;br /&gt;&lt;br /&gt;In practice, the &lt;span class="codeInline"&gt;MultiConverterGroup&lt;/span&gt; solves this ambiguity by leaning on the left-hand side of the path when converting backwards. In the example, it will pass output from &lt;span class="codeInline"&gt;Converter7&lt;/span&gt; into &lt;span class="codeInline"&gt;Converter4&lt;/span&gt; and then pass the output from that into &lt;span class="codeInline"&gt;Converter1&lt;/span&gt;.&lt;br /&gt;&lt;a name="TypeConverter"&gt;&lt;/a&gt;
&lt;h2&gt;TypeConverter&lt;/h2&gt;The &lt;span class="codeInline"&gt;TypeConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;TypeConverterExtension&lt;/span&gt; classes provide the ability to convert input values to different types. It is essentially a public implementation of the &lt;span class="codeInline"&gt;internal DefaultValueConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;SystemConvertConverter&lt;/span&gt; BCL types. It is useful in coercing a value to required type during a pipeline conversion using &lt;span class="codeInline"&gt;ConverterGroup&lt;/span&gt;. Using it is straightforward:&lt;br /&gt;&lt;pre&gt;
&amp;lt;Label&amp;gt;
	&amp;lt;Label.Content&amp;gt;
		&amp;lt;Binding Path=”Dob”&amp;gt;
			&amp;lt;Binding.Converter&amp;gt;
				&amp;lt;con:ConverterGroup&amp;gt;
					&amp;lt;con:TypeConverter TargetType=”{x:Type sys:DateTime}”/&amp;gt;
					&amp;lt;con:DateTimeConverter TargetKind=”Local”/&amp;gt;
				&amp;lt;/con:ConverterGroup&amp;gt;
			&amp;lt;/Binding.Converter&amp;gt;
		&amp;lt;/Binding&amp;gt;
	&amp;lt;/Label.Content&amp;gt;
&amp;lt;/Label&amp;gt;
&lt;/pre&gt;&lt;br /&gt;In this highly fabricated example, there is a &lt;span class="codeInline"&gt;Dob&lt;/span&gt; property that is a &lt;span class="codeInline"&gt;string&lt;/span&gt; when it really should be a &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;. A &lt;span class="codeInline"&gt;TypeConverter&lt;/span&gt; is used to convert the &lt;span class="codeInline"&gt;string&lt;/span&gt; to a &lt;span class="codeInline"&gt;DateTime&lt;/span&gt; prior to feeding it into a &lt;span class="codeInline"&gt;DateTimeConverter&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The &lt;span class="codeInline"&gt;TypeConverter&lt;/span&gt; will first attempt to convert data by way of an &lt;span class="codeInline"&gt;IConvertible&lt;/span&gt; implementation. If the value does not implement &lt;span class="codeInline"&gt;IConvertible&lt;/span&gt; then an attempt will be made to use any &lt;span class="codeInline"&gt;System.ComponentModel.TypeConverter&lt;/span&gt; implementation type for the class. If all attempts to convert the value fail, &lt;span class="codeInline"&gt;DependencyProperty.UnsetValue&lt;/span&gt; will be returned.&lt;br /&gt;&lt;a name="DataBindingAndConverters"&gt;&lt;/a&gt;
&lt;h1&gt;Data Binding and Converters&lt;/h1&gt;The observant among you may have noticed that my converter implementations inherit from &lt;span class="codeInline"&gt;DependencyObject&lt;/span&gt; and define their properties as &lt;span class="codeInline"&gt;DependencyProperty&lt;/span&gt;s. You may see this and try something like:&lt;br /&gt;&lt;pre&gt;
&amp;lt;Label&amp;gt;
	&amp;lt;Label.Content&amp;gt;
		&amp;lt;Binding Path=”Name”&amp;gt;
			&amp;lt;Binding.Converter&amp;gt;
				&amp;lt;con:CaseConverter Casing=”{Binding Casing}”/&amp;gt;
			&amp;lt;/Binding.Converter&amp;gt;
		&amp;lt;/Binding&amp;gt;
	&amp;lt;/Label.Content&amp;gt;
&amp;lt;/Label&amp;gt;
&lt;/pre&gt;&lt;br /&gt;Alas, this won’t work, at least with the current version of WPF. You’ll get an error:&lt;br /&gt;&lt;pre&gt;
Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Casing; DataItem=null; target element is &amp;#39;CaseConverter&amp;#39;
&lt;/pre&gt;&lt;br /&gt;So why did I bother with &lt;span class="codeInline"&gt;DependencyObject&lt;/span&gt;s? Well, if you really need to bind properties on your converters you can use &lt;a href="http://Josh Smith’s virtual branch technique" class="externalLink"&gt;http://www.codeproject.com/WPF/AttachingVirtualBranches.asp&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; to do so.&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>kentcb</author><pubDate>Wed, 24 Feb 2010 19:16:54 GMT</pubDate><guid isPermaLink="false">Updated Wiki: User Documentation 20100224071654P</guid></item><item><title>UPDATED WIKI: User Documentation</title><link>http://www.codeplex.com/wpfconverters/Wiki/View.aspx?title=User Documentation&amp;version=2</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
User Documentation
&lt;/h1&gt;&lt;h2&gt;
Contents
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#Overview"&gt;Overview&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#SetUp"&gt;Set Up&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#Converters"&gt;Converters&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#CaseConverter"&gt;CaseConverter&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#FormatConverter"&gt;FormatConverter&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#DateTimeConverter"&gt;DateTimeConverter&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#MapConverter"&gt;MapConverter&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#ExpressionConverter"&gt;ExpressionConverter&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#AWord"&gt;A Word on the ExpressionConverter’s Parser&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;a href="#ConverterGroup"&gt;ConverterGroup&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#MultiConverterGroup"&gt;MultiConverterGroup&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#TypeConverter"&gt;TypeConverter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;a href="#DataBindingAndConverters"&gt;Data Binding and Converters&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;a name="Overview"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;
Overview
&lt;/h1&gt;WPF’s &lt;span class="codeInline"&gt;Binding&lt;/span&gt; and &lt;span class="codeInline"&gt;MultiBinding&lt;/span&gt; types define a &lt;span class="codeInline"&gt;Converter&lt;/span&gt; property that allows you to provide a converter that will be used during the binding process. If you don’t explicitly specify a value converter, WPF will use its built-in primitive ones behind the scenes (such as &lt;span class="codeInline"&gt;DefaultValueConverter&lt;/span&gt;, &lt;span class="codeInline"&gt;ObjectTargetConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;SystemConvertConverter&lt;/span&gt; – all are &lt;span class="codeInline"&gt;internal&lt;/span&gt; types defined in the &lt;span class="codeInline"&gt;MS.Internal.Data&lt;/span&gt; namespace).&lt;br /&gt; &lt;br /&gt;If you &lt;i&gt;do&lt;/i&gt; specify a value converter, WPF will invoke methods on your converter during the data binding process. These methods are:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;&lt;span class="codeInline"&gt;Convert()&lt;/span&gt;. Called to convert a value when propagating it from the binding source to the binding target.&lt;/li&gt;&lt;li&gt;&lt;span class="codeInline"&gt;ConvertBack()&lt;/span&gt;. Called to convert a value when propagating it from the binding target to the binding source.&lt;/li&gt;
&lt;/ul&gt;The following diagram depicts this process:&lt;br /&gt;&lt;img src="http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=wpfconverters&amp;amp;DownloadId=25506" alt="Binding.png" /&gt;&lt;br /&gt;What I have found whilst working with WPF is that value converters (shown in the middle of the above diagram) are often needed to solve similar problems. This article and code library seeks to address the most common converter requirements and alleviate the need for a lot of custom converter code in any WPF application.&lt;br /&gt; &lt;br /&gt;The following converters are included in this project:&lt;br /&gt; &lt;br /&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Name &lt;/th&gt;&lt;th&gt; Supports Singular Conversions &lt;/th&gt;&lt;th&gt; Supports Multiple Conversions &lt;/th&gt;&lt;th&gt; Supports Forward Conversions &lt;/th&gt;&lt;th&gt; Supports Backward Conversions &lt;/th&gt;&lt;th&gt; Has Markup Extension &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; &lt;a href="#CaseConverter"&gt;CaseConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; &lt;a href="#ConverterGroup"&gt;ConverterGroup&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes (1) &lt;/td&gt;&lt;td&gt; Yes (2) &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; &lt;a href="#DateTimeConverter"&gt;DateTimeConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; &lt;a href="#ExpressionConverter"&gt;ExpressionConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes (3) &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; &lt;a href="#FormatConverter"&gt;FormatConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes (4) &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; &lt;a href="#MapConverter"&gt;MapConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; &lt;a href="#MultiConverterGroup"&gt;MultiConverterGroup&lt;/a&gt; &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes (5) &lt;/td&gt;&lt;td&gt; Yes (6) &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; &lt;a href="#TypeConverter"&gt;TypeConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;ol&gt;
&lt;li&gt;Assuming all child converters support forward conversions.&lt;/li&gt;&lt;li&gt;Assuming all child converters support backward conversions.&lt;/li&gt;&lt;li&gt;In fact, this is the only way to use the expression converter.&lt;/li&gt;&lt;li&gt;Only for singular conversions.&lt;/li&gt;&lt;li&gt;Assuming all child converters support forward conversions.&lt;/li&gt;&lt;li&gt;Assuming all child converters support backward conversions.&lt;/li&gt;
&lt;/ol&gt;&lt;a name="UsingWPFConverters"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;
Using WPF Converters
&lt;/h1&gt;To use WPF Converters, you need to:&lt;br /&gt;&lt;ol&gt;
&lt;li&gt;Add a reference to the &lt;i&gt;Kent.Boogaart.Converters.dll&lt;/i&gt; assembly.&lt;/li&gt;&lt;li&gt;Declare an XML-&amp;gt;CLR namespace mapping to &lt;i&gt;http://schemas.kent.boogaart.com/converters&lt;/i&gt;.&lt;/li&gt;
&lt;/ol&gt; &lt;br /&gt;All the examples on this page assume a declaration such as:&lt;br /&gt;&lt;pre&gt;
&amp;lt;Window xmlns:con=&amp;quot;http://schemas.kent.boogaart.com/converters&amp;quot;&amp;gt;
&lt;/pre&gt;&lt;a name="Converters"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;
Converters
&lt;/h1&gt;In this section, each of the converters will be discussed in some detail. Note that there are further usage examples available in the API documentation.&lt;br /&gt;&lt;a name="CaseConverter"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
CaseConverter
&lt;/h2&gt;The &lt;span class="codeInline"&gt;CaseConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;CaseConverterExtension&lt;/span&gt; classes allow you to convert a &lt;span class="codeInline"&gt;string&lt;/span&gt; to upper or lower case. They accept a single parameter: &lt;span class="codeInline"&gt;Casing&lt;/span&gt;, which is used to specify the desired case for the resultant &lt;span class="codeInline"&gt;string&lt;/span&gt;. It is very simple to use, as the following example demonstrates:&lt;br /&gt;&lt;pre&gt;
&amp;lt;TextBox x:Name=&amp;quot;_textBox&amp;quot;/&amp;gt;
&amp;lt;Label Content=&amp;quot;{Binding Text, ElementName=_textBox, Converter={con:CaseConverter Upper}}&amp;quot;/&amp;gt;
&amp;lt;Label Content=&amp;quot;{Binding Text, ElementName=_textBox, Converter={con:CaseConverter Lower}}&amp;quot;/&amp;gt;
&lt;/pre&gt;Anything typed in the &lt;span class="codeInline"&gt;TextBox&lt;/span&gt; will be displayed in uppercase in the first &lt;span class="codeInline"&gt;Label&lt;/span&gt;, and lowercase in the second.&lt;br /&gt;&lt;a name="FormatConverter"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
FormatConverter
&lt;/h2&gt;The &lt;span class="codeInline"&gt;FormatConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;FormatConverterExtension&lt;/span&gt; classes allow you to convert any number of &lt;span class="codeInline"&gt;object&lt;/span&gt;s to a &lt;span class="codeInline"&gt;string&lt;/span&gt; by using .NET’s standard formatting capabilities. They accept a single parameter: &lt;span class="codeInline"&gt;FormatString&lt;/span&gt;, which defines the format for the resultant &lt;span class="codeInline"&gt;string&lt;/span&gt;.&lt;br /&gt;When binding to a single value it can be used as follows:&lt;br /&gt;&lt;pre&gt;
&amp;lt;TextBox x:Name=&amp;quot;_textBox&amp;quot;/&amp;gt;
&amp;lt;Label Content=&amp;quot;{Binding Text, ElementName=_textBox, Converter={con:FormatConverter {}Your name is {0}}}&amp;quot;/&amp;gt;
&lt;/pre&gt;Note how the format &lt;span class="codeInline"&gt;string&lt;/span&gt; passed to the &lt;span class="codeInline"&gt;FormatConverter&lt;/span&gt; is escaped with &amp;quot;{}&amp;quot;, which is necessary because it contains the &amp;quot; and &amp;quot; characters within it. The format &lt;span class="codeInline"&gt;string&lt;/span&gt; on its own is simply &amp;quot;Your name is {0}&amp;quot;.&lt;br /&gt;Binding to multiple values looks like this:&lt;br /&gt;&lt;pre&gt;
&amp;lt;TextBox x:Name=&amp;quot;_textBox1&amp;quot;/&amp;gt;
&amp;lt;TextBox x:Name=&amp;quot;_textBox2&amp;quot;/&amp;gt;
&amp;lt;Label&amp;gt;
	&amp;lt;Label.Content&amp;gt;
		&amp;lt;MultiBinding Converter=&amp;quot;{con:FormatConverter {}You said {0} and {1}.}&amp;quot;&amp;gt;
			&amp;lt;Binding Path=&amp;quot;Text&amp;quot; ElementName=&amp;quot;_textBox1&amp;quot;/&amp;gt;
			&amp;lt;Binding Path=&amp;quot;Text&amp;quot; ElementName=&amp;quot;_textBox2&amp;quot;/&amp;gt;
		&amp;lt;/MultiBinding&amp;gt;
	&amp;lt;/Label.Content&amp;gt;
&amp;lt;/Label&amp;gt;
&lt;/pre&gt;&lt;a name="DateTimeConverter"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
DateTimeConverter
&lt;/h2&gt;The &lt;span class="codeInline"&gt;DateTimeConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;DateTimeConverterExtension&lt;/span&gt; classes allow you to perform specialized conversions on &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s during data binding. Using these classes, you can do any of the following:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Convert between different kinds of &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s (e.g. convert between UTC and local time).&lt;/li&gt;&lt;li&gt;Convert between different kinds of &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s without changing the underlying &lt;span class="codeInline"&gt;DateTime&lt;/span&gt; value (i.e. convert by using &lt;span class="codeInline"&gt;DateTime.SpecifyKind()&lt;/span&gt; instead of &lt;span class="codeInline"&gt;ToLocalTime()&lt;/span&gt; or &lt;span class="codeInline"&gt;ToUniversalTime()&lt;/span&gt;).&lt;/li&gt;&lt;li&gt;Adjust &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s during conversion by adding a &lt;span class="codeInline"&gt;TimeSpan&lt;/span&gt; to them.&lt;/li&gt;
&lt;/ul&gt;The &lt;span class="codeInline"&gt;DateTimeConverter&lt;/span&gt; supports both forward and backwards conversions. This allows you, for example, to store &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s in UTC format in your business objects but convert them to local time prior to using them in your interface. The following example shows how you could achieve this (and assumes the existence of a WPF &lt;span class="codeInline"&gt;DatePicker&lt;/span&gt; class):&lt;br /&gt;&lt;pre&gt;
&amp;lt;DatePicker Value=&amp;quot;{Binding StartDate, Converter={con:DateTimeConverter TargetKind=Local, SourceKind=Utc}}&amp;quot;/&amp;gt;
&lt;/pre&gt;&lt;a name="MapConverter"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
MapConverter
&lt;/h2&gt;The &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; class (which has no corresponding markup extension) can be used to map one set of values to another. This is an extremely useful converter that has many use cases. Here are some examples:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Converting enumeration values to human-readable strings prior to display.&lt;/li&gt;&lt;li&gt;Converting between &lt;span class="codeInline"&gt;bool&lt;/span&gt; values and &lt;span class="codeInline"&gt;Visibility&lt;/span&gt; enumeration values.&lt;/li&gt;&lt;li&gt;Converting between &lt;span class="codeInline"&gt;bool&lt;/span&gt; values and an &lt;span class="codeInline"&gt;ImageSource&lt;/span&gt; so the user sees a tick or a cross depending on the &lt;span class="codeInline"&gt;bool&lt;/span&gt; value.&lt;/li&gt;
&lt;/ul&gt;The &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; works by using a collection of &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; objects. Each &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; object specifies a value to map &lt;i&gt;from&lt;/i&gt; and a value to map &lt;i&gt;to&lt;/i&gt;. The same &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; objects are used both for forward conversions and backward conversions.&lt;br /&gt;If no relevant &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; object can be found during a conversion, the &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; uses its &lt;span class="codeInline"&gt;FallbackBehavior&lt;/span&gt; property to decide what to do. You can tell it to either return &lt;span class="codeInline"&gt;DependencyProperty.UnsetValue&lt;/span&gt; or to return the value it was asked to convert.&lt;br /&gt;An example should make this all clear:&lt;br /&gt;&lt;pre&gt;
&amp;lt;Label&amp;gt;
	&amp;lt;Label.Content&amp;gt;
		&amp;lt;Binding Path=&amp;quot;Gender&amp;quot;&amp;gt;
			&amp;lt;Binding.Converter&amp;gt;
				&amp;lt;con:MapConverter&amp;gt;
					&amp;lt;con:Mapping From=&amp;quot;{x:Static Gender.Male}&amp;quot; To=&amp;quot;Guy&amp;quot;/&amp;gt;
					&amp;lt;con:Mapping From=&amp;quot;{x:Static Gender.Female}&amp;quot; To=&amp;quot;Gal&amp;quot;/&amp;gt;
				&amp;lt;/con:MapConverter&amp;gt;
			&amp;lt;/Binding.Converter&amp;gt;
		&amp;lt;/Binding&amp;gt;
	&amp;lt;/Label.Content&amp;gt;
&amp;lt;/Label&amp;gt;
&lt;/pre&gt;This example uses a &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; to convert from members in a &lt;span class="codeInline"&gt;Gender&lt;/span&gt; enumeration to either &amp;quot;Guy&amp;quot; or &amp;quot;Gal&amp;quot;. Now suppose that the &lt;span class="codeInline"&gt;Gender&lt;/span&gt; enumeration also defines a value of &lt;span class="codeInline"&gt;Unknown&lt;/span&gt; (a wise move in these modern times). The above mapping won’t successfully convert values of &lt;span class="codeInline"&gt;Unknown&lt;/span&gt; – it will just return &lt;span class="codeInline"&gt;DependencyProperty.UnsetValue&lt;/span&gt; instead.&lt;br /&gt;If you want unknown genders to display as &amp;quot;Unknown&amp;quot; you can either add another &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; or just tell the &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; to return the original value if it cannot map the value it is given:&lt;br /&gt;&lt;pre&gt;
&amp;lt;con:MapConverter FallbackBehavior=&amp;quot;ReturnOriginalValue&amp;quot;&amp;gt;
	&amp;lt;con:Mapping From=&amp;quot;{x:Static Gender.Male}&amp;quot; To=&amp;quot;Guy&amp;quot;/&amp;gt;
	&amp;lt;con:Mapping From=&amp;quot;{x:Static Gender.Female}&amp;quot; To=&amp;quot;Gal&amp;quot;/&amp;gt;
&amp;lt;/con:MapConverter&amp;gt;
&lt;/pre&gt;A &lt;span class="codeInline"&gt;FallbackBehavior&lt;/span&gt; of &lt;span class="codeInline"&gt;ReturnOriginalValue&lt;/span&gt; is extremely useful where you only want to map a subset of the total possible values.&lt;br /&gt;&lt;a name="ExpressionConverter"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
ExpressionConverter
&lt;/h2&gt;The &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;ExpressionConverterExtension&lt;/span&gt; classes allow you to convert one or more bound values by running them through a C#-like expression. The expression uses placeholders of the form &lt;span class="codeInline"&gt;{x&lt;/span&gt;} to demarcate bound arguments, where &lt;span class="codeInline"&gt;x&lt;/span&gt; is the argument number starting at zero.&lt;br /&gt; &lt;br /&gt;Let’s start with something simple:&lt;br /&gt;&lt;pre&gt;
&amp;lt;Canvas&amp;gt;
	&amp;lt;Slider x:Name=&amp;quot;_slider&amp;quot; Width=&amp;quot;300&amp;quot; Minimum=&amp;quot;1&amp;quot; Maximum=&amp;quot;100&amp;quot;/&amp;gt;
	&amp;lt;Rectangle Canvas.Top=&amp;quot;20&amp;quot; Fill=&amp;quot;Red&amp;quot; Width=&amp;quot;100&amp;quot; Height=&amp;quot;{Binding Value, ElementName=_slider}&amp;quot;/&amp;gt;
	&amp;lt;Rectangle Canvas.Top=&amp;quot;100&amp;quot; Fill=&amp;quot;Blue&amp;quot; Width=&amp;quot;100&amp;quot; Height=&amp;quot;{Binding Value, ElementName=_slider, Converter={con:ExpressionConverter {}{0} * 2}}&amp;quot;/&amp;gt;
&amp;lt;/Canvas&amp;gt;
&lt;/pre&gt;In this example, the value of the &lt;span class="codeInline"&gt;Slider&lt;/span&gt; dictates the height of the first rectangle. It also dictates the height of the second rectangle, but an &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; is used to double the value first.&lt;br /&gt; &lt;br /&gt;Notice how the expression passed to the &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; is escaped with &amp;quot;{}&amp;quot;. As with the FormatConverter, this is necessary because it includes the &amp;quot; and &amp;quot; characters. The expression on its own is simply &lt;span class="codeInline"&gt;&amp;quot;{0} * 2&amp;quot;&lt;/span&gt;. In English, this means &amp;quot;multiply the first argument by two&amp;quot;.&lt;br /&gt; &lt;br /&gt;Now, let’s do something a little more complex:&lt;br /&gt;&lt;pre&gt;
&amp;lt;StackPanel x:Name=&amp;quot;_panel&amp;quot;&amp;gt;
	&amp;lt;Label&amp;gt;What bands do you like?&amp;lt;/Label&amp;gt;
	&amp;lt;CheckBox x:Name=&amp;quot;_rammstein&amp;quot;&amp;gt;Rammstein&amp;lt;/Label&amp;gt;
	&amp;lt;CheckBox x:Name=&amp;quot;_powderfinger&amp;quot;&amp;gt;Powderfinger&amp;lt;/Label&amp;gt;
	&amp;lt;CheckBox x:Name=&amp;quot;_nickelback&amp;quot;&amp;gt;Nickelback&amp;lt;/Label&amp;gt;
	&amp;lt;CheckBox x:Name=&amp;quot;_ministry&amp;quot;&amp;gt;Ministry&amp;lt;/Label&amp;gt;
	&amp;lt;Button Content=&amp;quot;Let me in!&amp;quot;&amp;gt;
		&amp;lt;Button.IsEnabled&amp;gt;
			&amp;lt;MultiBinding Converter=&amp;quot;{ExpressionConverter {}{0} &amp;amp;amp;&amp;amp;amp; {1} &amp;amp;amp;&amp;amp;amp; {3} &amp;amp;amp;&amp;amp;amp; !{2}}&amp;quot;&amp;gt;
				&amp;lt;Binding Path=&amp;quot;IsChecked&amp;quot; ElementName=&amp;quot;_rammstein&amp;quot;/&amp;gt;
				&amp;lt;Binding Path=&amp;quot;IsChecked&amp;quot; ElementName=&amp;quot;_powderfinger&amp;quot;/&amp;gt;
				&amp;lt;Binding Path=&amp;quot;IsChecked&amp;quot; ElementName=&amp;quot;_nickelback&amp;quot;/&amp;gt;
				&amp;lt;Binding Path=&amp;quot;IsChecked&amp;quot; ElementName=&amp;quot;_ministry&amp;quot;/&amp;gt;
			&amp;lt;/MultiBinding&amp;gt;
		&amp;lt;/Button.IsEnabled&amp;gt;
	&amp;lt;/Button&amp;gt;
&amp;lt;/StackPanel&amp;gt;
&lt;/pre&gt;In this example, the entry button is only enabled if the correct combination of bands is chosen. If you don’t like one of the good bands or if you &lt;i&gt;do&lt;/i&gt; like the sucky band, you won’t be allowed in.&lt;br /&gt; &lt;br /&gt;The actual expression has again been escaped due to its presence in XAML. Unescaped, it is simply &lt;span class="codeInline"&gt;&amp;quot;{0} &amp;amp;&amp;amp; {1} &amp;amp;&amp;amp; {3} &amp;amp;&amp;amp; !{2}&amp;quot;. An alternative approach that avoids all this escaping is to use a more long-winded syntax in the {{MultiBinding&lt;/span&gt; as follows:&lt;br /&gt;&lt;pre&gt;
&amp;lt;MultiBinding&amp;gt;
	&amp;lt;MultiBinding.Converter&amp;gt;
		&amp;lt;con:ExpressionConverterExtension&amp;gt;
			&amp;lt;con:ExpressionConverterExtension.Expression&amp;gt;
				&amp;lt;![CDATA[
				{0} &amp;amp;&amp;amp; {1} &amp;amp;&amp;amp; {3} &amp;amp;&amp;amp; !{2}
				]]&amp;gt;
			&amp;lt;/con:ExpressionConverterExtension.Expression&amp;gt;
		&amp;lt;/con:ExpressionConverterExtension&amp;gt;
	&amp;lt;/MultiBinding.Converter&amp;gt;
&amp;lt;/MultiBinding&amp;gt;
&lt;/pre&gt;The &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; supports a lot of C# operators and we’ve only scratched the surface of the possibilities here. Please see the API documentation for a full list of supported operators.&lt;br /&gt;&lt;a name="AWord"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;
A Word on the ExpressionConverter’s Parser
&lt;/h3&gt;I am not going to go into detail here on the implementation of the parser behind the &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt;. For a good overview on writing a code parser, you should check out &lt;a href="Tommy%20Carlier%e2%80%99s%20series" class="externalLink"&gt;http://tommycarlier.blogspot.com/2007/05/writing-parser-overview.html&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; or any good book on compiler construction. However, I would like to point out a few things.&lt;br /&gt; &lt;br /&gt;Firstly, I did not leverage .NET’s C# CodeDom implementation to parse the expressions. This was due to the imposed security restrictions. I want the &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; to be usable in low trust applications (including Silverlight).&lt;br /&gt; &lt;br /&gt;Secondly, I did not leverage ANTLR to generate the parser because then my library would have a dependency of the .NET ANTLR runtime. This was not an option as I was trying to keep the overhead of my library to a minimum. Of course, I did experiment with both CodeDom and ANTLR prior to implementing the parser. This gave me some insights and helped me formulate goals for the parser. Some things that are not supported by my implementation are:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Verbatim &lt;span class="codeInline"&gt;string&lt;/span&gt;s (i.e. strings starting with &lt;span class="codeInline"&gt;@&lt;/span&gt;).&lt;/li&gt;&lt;li&gt;Hexadecimal or Unicode escape sequences in &lt;span class="codeInline"&gt;string&lt;/span&gt;s (but common escape sequences such as &lt;span class="codeInline"&gt;\n&lt;/span&gt; and &lt;span class="codeInline"&gt;\t&lt;/span&gt; are supported).&lt;/li&gt;&lt;li&gt;Property accessors (e.g. an expression such as &lt;span class="codeInline"&gt;&amp;quot;{0}.Age &amp;gt; 18&amp;quot;&lt;/span&gt; will not work).&lt;/li&gt;&lt;li&gt;Array indexers (e.g. an expression such as &lt;span class="codeInline"&gt;&amp;quot;{0}[0] &amp;gt; {0}[1]&amp;quot;&lt;/span&gt; will not work).&lt;/li&gt;&lt;li&gt;Branching statements (and in particular, no ternary operator).&lt;/li&gt;
&lt;/ul&gt;These features were left out consciously: either because of space constraints, concerns about abuse, or concerns about the efficiency of an interpretive implementation. If you feel there is good reason to include some of these features then please let me know. If you make a strong case I may well add your feature of choice.&lt;br /&gt; &lt;br /&gt;Finally, as I hinted at above, the current implementation of the parser functions as an interpreter. It does not yet leverage .NET’s &lt;span class="codeInline"&gt;DynamicMethod&lt;/span&gt; class to produce compiled output, but it may in the future . Note that expressions given to the &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; are parsed only once. After being parsed, the same abstract syntax tree (AST) is used to evaluate the expression any number of times. Having said that, evaluation of the expressions will be slower than an otherwise equivalent implementation based on &lt;span class="codeInline"&gt;DynamicMethod&lt;/span&gt;. If this proves to be a problem in the real world then I may change the implementation.&lt;br /&gt;&lt;a name="ConverterGroup"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
ConverterGroup
&lt;/h2&gt;The &lt;span class="codeInline"&gt;Binding&lt;/span&gt; class only allows you to provide one converter. The &lt;span class="codeInline"&gt;ConverterGroup&lt;/span&gt; class allows you to construct a pipeline of converters that can be assigned to a &lt;span class="codeInline"&gt;Binding&lt;/span&gt;, which essentially annuls this restriction. Here’s an example:&lt;br /&gt;&lt;pre&gt;
&amp;lt;TextBox x:Name=”_textBox”/&amp;gt;
&amp;lt;Label&amp;gt;
	&amp;lt;Label.Content&amp;gt;
		&amp;lt;Binding Path=”Text” ElementName=”_textBox”&amp;gt;
			&amp;lt;Binding.Converter&amp;gt;
				&amp;lt;con:ConverterGroup&amp;gt;
					&amp;lt;con:CaseConverter Casing=”Upper”/&amp;gt;
					&amp;lt;con:FormatConverter FormatString=”In uppercase, you entered ‘{0}’.”/&amp;gt;
				&amp;lt;/con:ConverterGroup&amp;gt;
			&amp;lt;/Binding.Converter&amp;gt;
		&amp;lt;/Binding&amp;gt;
	&amp;lt;/Label.Content&amp;gt;
&amp;lt;/Label&amp;gt;
&lt;/pre&gt;In this example, any input in the &lt;span class="codeInline"&gt;TextBox&lt;/span&gt; is first converted to uppercase with the &lt;span class="codeInline"&gt;CaseConverter&lt;/span&gt; and then formatted via the &lt;span class="codeInline"&gt;FormatConverter&lt;/span&gt;. If all converters in the pipeline support backward conversions (not so in this case) then the &lt;span class="codeInline"&gt;ConverterGroup&lt;/span&gt; will also support backwards conversions.&lt;br /&gt;&lt;a name="MultiConverterGroup"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
MultiConverterGroup
&lt;/h2&gt;The &lt;span class="codeInline"&gt;MultiConverterGroup&lt;/span&gt; class has the same goals as the &lt;span class="codeInline"&gt;ConverterGroup&lt;/span&gt; class except that it is an implementation of &lt;span class="codeInline"&gt;IMultiValueConverter&lt;/span&gt; rather than &lt;span class="codeInline"&gt;IValueConverter&lt;/span&gt;. It works with a pipeline of steps (represented by instances of &lt;span class="codeInline"&gt;MultiConverterGroupStep&lt;/span&gt;). Each step can have any number of multi-value converters in it. The output from each step is the combined output from each converter in the step. This output is then fed into the next step.&lt;br /&gt; &lt;br /&gt;If your head hurts from reading that (mine sure does after writing it) then perhaps this diagram will help:&lt;br /&gt;&lt;img src="http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=wpfconverters&amp;amp;DownloadId=25507" alt="MultiConverterGroup.png" /&gt;&lt;br /&gt;The above example defines three steps in the conversion pipeline. The &lt;span class="codeInline"&gt;MultiConverterGroup&lt;/span&gt; combines objects output from the converters in &lt;i&gt;Step 1&lt;/i&gt; and uses that as the input to &lt;i&gt;Step 2&lt;/i&gt;. Similarly, the output from &lt;i&gt;Step 2&lt;/i&gt; is fed into &lt;i&gt;Step 3&lt;/i&gt;. The XAML for this example would look like this:&lt;br /&gt;&lt;pre&gt;
&amp;lt;con:MultiConverterGroup&amp;gt;
	&amp;lt;MultiConverterGroupStep&amp;gt;
		&amp;lt;Converter1/&amp;gt;
		&amp;lt;Converter2/&amp;gt;
		&amp;lt;Converter3/&amp;gt;
	&amp;lt;/MultiConverterGroupStep&amp;gt;
	&amp;lt;MultiConverterGroupStep&amp;gt;
		&amp;lt;Converter4/&amp;gt;
		&amp;lt;Converter5/&amp;gt;
		&amp;lt;Converter6/&amp;gt;
	&amp;lt;/MultiConverterGroupStep&amp;gt;
	&amp;lt;MultiConverterGroupStep&amp;gt;
		&amp;lt;Converter7/&amp;gt;
	&amp;lt;/MultiConverterGroupStep&amp;gt;
&amp;lt;/con:MultiConverterGroup&amp;gt;
&lt;/pre&gt;Note that the last step must always have exactly one converter, which makes sense because at the end of the day the pipeline needs to produce a single value. If you violate this constraint, you’ll get an exception.&lt;br /&gt; &lt;br /&gt;So that covers forward conversions, but what about backward conversions? If you examine the diagram, you’ll realize that a backward conversion starts at the bottom and heads toward the top, but could take one of many paths. In theory, if all converters are implemented correctly and they all support backward conversions, then any path from the bottom to the top with the same input would yield the same output.&lt;br /&gt; &lt;br /&gt;In practice, the &lt;span class="codeInline"&gt;MultiConverterGroup&lt;/span&gt; solves this ambiguity by leaning on the left-hand side of the path when converting backwards. In the example, it will pass output from &lt;span class="codeInline"&gt;Converter7&lt;/span&gt; into &lt;span class="codeInline"&gt;Converter4&lt;/span&gt; and then pass the output from that into &lt;span class="codeInline"&gt;Converter1&lt;/span&gt;.&lt;br /&gt;&lt;a name="TypeConverter"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
TypeConverter
&lt;/h2&gt;The &lt;span class="codeInline"&gt;TypeConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;TypeConverterExtension&lt;/span&gt; classes provide the ability to convert input values to different types. It is essentially a public implementation of the &lt;span class="codeInline"&gt;internal DefaultValueConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;SystemConvertConverter&lt;/span&gt; BCL types. It is useful in coercing a value to required type during a pipeline conversion using &lt;span class="codeInline"&gt;ConverterGroup&lt;/span&gt;. Using it is straightforward:&lt;br /&gt;&lt;pre&gt;
&amp;lt;Label&amp;gt;
	&amp;lt;Label.Content&amp;gt;
		&amp;lt;Binding Path=”Dob”&amp;gt;
			&amp;lt;Binding.Converter&amp;gt;
				&amp;lt;con:ConverterGroup&amp;gt;
					&amp;lt;con:TypeConverter TargetType=”{x:Type sys:DateTime}”/&amp;gt;
					&amp;lt;con:DateTimeConverter TargetKind=”Local”/&amp;gt;
				&amp;lt;/con:ConverterGroup&amp;gt;
			&amp;lt;/Binding.Converter&amp;gt;
		&amp;lt;/Binding&amp;gt;
	&amp;lt;/Label.Content&amp;gt;
&amp;lt;/Label&amp;gt;
&lt;/pre&gt;In this highly fabricated example, there is a &lt;span class="codeInline"&gt;Dob&lt;/span&gt; property that is a &lt;span class="codeInline"&gt;string&lt;/span&gt; when it really should be a &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;. A &lt;span class="codeInline"&gt;TypeConverter&lt;/span&gt; is used to convert the &lt;span class="codeInline"&gt;string&lt;/span&gt; to a &lt;span class="codeInline"&gt;DateTime&lt;/span&gt; prior to feeding it into a &lt;span class="codeInline"&gt;DateTimeConverter&lt;/span&gt;.&lt;br /&gt; &lt;br /&gt;The &lt;span class="codeInline"&gt;TypeConverter&lt;/span&gt; will first attempt to convert data by way of an &lt;span class="codeInline"&gt;IConvertible&lt;/span&gt; implementation. If the value does not implement &lt;span class="codeInline"&gt;IConvertible&lt;/span&gt; then an attempt will be made to use any &lt;span class="codeInline"&gt;System.ComponentModel.TypeConverter&lt;/span&gt; implementation type for the class. If all attempts to convert the value fail, &lt;span class="codeInline"&gt;DependencyProperty.UnsetValue&lt;/span&gt; will be returned.&lt;br /&gt;&lt;a name="DataBindingAndConverters"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;
Data Binding and Converters
&lt;/h1&gt;The observant among you may have noticed that my converter implementations inherit from &lt;span class="codeInline"&gt;DependencyObject&lt;/span&gt; and define their properties as &lt;span class="codeInline"&gt;DependencyProperty&lt;/span&gt;s. You may see this and try something like:&lt;br /&gt;&lt;pre&gt;
&amp;lt;Label&amp;gt;
	&amp;lt;Label.Content&amp;gt;
		&amp;lt;Binding Path=”Name”&amp;gt;
			&amp;lt;Binding.Converter&amp;gt;
				&amp;lt;con:CaseConverter Casing=”{Binding Casing}”/&amp;gt;
			&amp;lt;/Binding.Converter&amp;gt;
		&amp;lt;/Binding&amp;gt;
	&amp;lt;/Label.Content&amp;gt;
&amp;lt;/Label&amp;gt;
&lt;/pre&gt;Alas, this won’t work, at least with the current version of WPF. You’ll get an error:&lt;br /&gt;&lt;pre&gt;
Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Casing; DataItem=null; target element is 'CaseConverter'
&lt;/pre&gt;So why did I bother with &lt;span class="codeInline"&gt;DependencyObject&lt;/span&gt;s? Well, if you really need to bind properties on your converters you can use &lt;a href="Josh%20Smith%e2%80%99s%20virtual%20branch%20technique" class="externalLink"&gt;http://www.codeproject.com/WPF/AttachingVirtualBranches.asp&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; to do so.&lt;br /&gt;
&lt;/div&gt;</description><author>kentcb</author><pubDate>Sat, 12 Jan 2008 17:25:22 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: User Documentation 20080112052522P</guid></item><item><title>UPDATED WIKI: User Documentation</title><link>http://www.codeplex.com/wpfconverters/Wiki/View.aspx?title=User Documentation&amp;version=1</link><description>&lt;div class="wikidoc"&gt;
&lt;h1&gt;
User Documentation
&lt;/h1&gt;&lt;h2&gt;
Contents
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#Overview"&gt;Overview&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#SetUp"&gt;Set Up&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#Converters"&gt;Converters&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#CaseConverter"&gt;CaseConverter&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#FormatConverter"&gt;FormatConverter&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#DateTimeConverter"&gt;DateTimeConverter&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#MapConverter"&gt;MapConverter&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#ExpressionConverter"&gt;ExpressionConverter&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#AWord"&gt;A Word on the ExpressionConverter’s Parser&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;a href="#ConverterGroup"&gt;ConverterGroup&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#MultiConverterGroup"&gt;MultiConverterGroup&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#TypeConverter"&gt;TypeConverter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;a href="#DataBindingAndConverters"&gt;Data Binding and Converters&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;a name="Overview"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;
Overview
&lt;/h1&gt;WPF’s &lt;span class="codeInline"&gt;Binding&lt;/span&gt; and &lt;span class="codeInline"&gt;MultiBinding&lt;/span&gt; types define a &lt;span class="codeInline"&gt;Converter&lt;/span&gt; property that allows you to provide a converter that will be used during the binding process. If you don’t explicitly specify a value converter, WPF will use its built-in primitive ones behind the scenes (such as &lt;span class="codeInline"&gt;DefaultValueConverter&lt;/span&gt;, &lt;span class="codeInline"&gt;ObjectTargetConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;SystemConvertConverter&lt;/span&gt; – all are &lt;span class="codeInline"&gt;internal&lt;/span&gt; types defined in the &lt;span class="codeInline"&gt;MS.Internal.Data&lt;/span&gt; namespace).&lt;br /&gt; &lt;br /&gt;If you &lt;i&gt;do&lt;/i&gt; specify a value converter, WPF will invoke methods on your converter during the data binding process. These methods are:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;&lt;span class="codeInline"&gt;Convert()&lt;/span&gt;. Called to convert a value when propagating it from the binding source to the binding target.&lt;/li&gt;&lt;li&gt;&lt;span class="codeInline"&gt;ConvertBack()&lt;/span&gt;. Called to convert a value when propagating it from the binding target to the binding source.&lt;/li&gt;
&lt;/ul&gt;The following diagram depicts this process:&lt;br /&gt;&lt;span class="unresolved"&gt;Cannot resolve link: &lt;/span&gt;[image:Binding.png]&lt;br /&gt;What I have found whilst working with WPF is that value converters (shown in the middle of the above diagram) are often needed to solve similar problems. This article and code library seeks to address the most common converter requirements and alleviate the need for a lot of custom converter code in any WPF application.&lt;br /&gt; &lt;br /&gt;The following converters are included in this project:&lt;br /&gt; &lt;br /&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Name &lt;/th&gt;&lt;th&gt; Supports Singular Conversions &lt;/th&gt;&lt;th&gt; Supports Multiple Conversions &lt;/th&gt;&lt;th&gt; Supports Forward Conversions &lt;/th&gt;&lt;th&gt; Supports Backward Conversions &lt;/th&gt;&lt;th&gt; Has Markup Extension &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; &lt;a href="#CaseConverter"&gt;CaseConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; &lt;a href="#ConverterGroup"&gt;ConverterGroup&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes (1) &lt;/td&gt;&lt;td&gt; Yes (2) &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; &lt;a href="#DateTimeConverter"&gt;DateTimeConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; &lt;a href="#ExpressionConverter"&gt;ExpressionConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes (3) &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; &lt;a href="#FormatConverter"&gt;FormatConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes (4) &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; &lt;a href="#MapConverter"&gt;MapConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; &lt;a href="#MultiConverterGroup"&gt;MultiConverterGroup&lt;/a&gt; &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes (5) &lt;/td&gt;&lt;td&gt; Yes (6) &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; &lt;a href="#TypeConverter"&gt;TypeConverter&lt;/a&gt; &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; No &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;&lt;td&gt; Yes &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;ol&gt;
&lt;li&gt;Assuming all child converters support forward conversions.&lt;/li&gt;&lt;li&gt;Assuming all child converters support backward conversions.&lt;/li&gt;&lt;li&gt;In fact, this is the only way to use the expression converter.&lt;/li&gt;&lt;li&gt;Only for singular conversions.&lt;/li&gt;&lt;li&gt;Assuming all child converters support forward conversions.&lt;/li&gt;&lt;li&gt;Assuming all child converters support backward conversions.&lt;/li&gt;
&lt;/ol&gt;&lt;a name="UsingWPFConverters"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;
Using WPF Converters
&lt;/h1&gt;To use WPF Converters, you need to:&lt;br /&gt;&lt;ol&gt;
&lt;li&gt;Add a reference to the &lt;i&gt;Kent.Boogaart.Converters.dll&lt;/i&gt; assembly.&lt;/li&gt;&lt;li&gt;Declare an XML-&amp;gt;CLR namespace mapping to &lt;i&gt;http://schemas.kent.boogaart.com/converters&lt;/i&gt;.&lt;/li&gt;
&lt;/ol&gt; &lt;br /&gt;All the examples on this page assume a declaration such as:&lt;br /&gt;&lt;pre&gt;
&amp;lt;Window xmlns:con=&amp;quot;http://schemas.kent.boogaart.com/converters&amp;quot;&amp;gt;
&lt;/pre&gt;&lt;a name="Converters"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;
Converters
&lt;/h1&gt;In this section, each of the converters will be discussed in some detail. Note that there are further usage examples available in the API documentation.&lt;br /&gt;&lt;a name="CaseConverter"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
CaseConverter
&lt;/h2&gt;The &lt;span class="codeInline"&gt;CaseConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;CaseConverterExtension&lt;/span&gt; classes allow you to convert a &lt;span class="codeInline"&gt;string&lt;/span&gt; to upper or lower case. They accept a single parameter: &lt;span class="codeInline"&gt;Casing&lt;/span&gt;, which is used to specify the desired case for the resultant &lt;span class="codeInline"&gt;string&lt;/span&gt;. It is very simple to use, as the following example demonstrates:&lt;br /&gt;&lt;pre&gt;
&amp;lt;TextBox x:Name=&amp;quot;_textBox&amp;quot;/&amp;gt;
&amp;lt;Label Content=&amp;quot;{Binding Text, ElementName=_textBox, Converter={con:CaseConverter Upper}}&amp;quot;/&amp;gt;
&amp;lt;Label Content=&amp;quot;{Binding Text, ElementName=_textBox, Converter={con:CaseConverter Lower}}&amp;quot;/&amp;gt;
&lt;/pre&gt;Anything typed in the &lt;span class="codeInline"&gt;TextBox&lt;/span&gt; will be displayed in uppercase in the first &lt;span class="codeInline"&gt;Label&lt;/span&gt;, and lowercase in the second.&lt;br /&gt;&lt;a name="FormatConverter"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
FormatConverter
&lt;/h2&gt;The &lt;span class="codeInline"&gt;FormatConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;FormatConverterExtension&lt;/span&gt; classes allow you to convert any number of &lt;span class="codeInline"&gt;object&lt;/span&gt;s to a &lt;span class="codeInline"&gt;string&lt;/span&gt; by using .NET’s standard formatting capabilities. They accept a single parameter: &lt;span class="codeInline"&gt;FormatString&lt;/span&gt;, which defines the format for the resultant &lt;span class="codeInline"&gt;string&lt;/span&gt;.&lt;br /&gt;When binding to a single value it can be used as follows:&lt;br /&gt;&lt;pre&gt;
&amp;lt;TextBox x:Name=&amp;quot;_textBox&amp;quot;/&amp;gt;
&amp;lt;Label Content=&amp;quot;{Binding Text, ElementName=_textBox, Converter={con:FormatConverter {}Your name is {0}}}&amp;quot;/&amp;gt;
&lt;/pre&gt;Note how the format &lt;span class="codeInline"&gt;string&lt;/span&gt; passed to the &lt;span class="codeInline"&gt;FormatConverter&lt;/span&gt; is escaped with &amp;quot;{}&amp;quot;, which is necessary because it contains the &amp;quot; and &amp;quot; characters within it. The format &lt;span class="codeInline"&gt;string&lt;/span&gt; on its own is simply &amp;quot;Your name is {0}&amp;quot;.&lt;br /&gt;Binding to multiple values looks like this:&lt;br /&gt;&lt;pre&gt;
&amp;lt;TextBox x:Name=&amp;quot;_textBox1&amp;quot;/&amp;gt;
&amp;lt;TextBox x:Name=&amp;quot;_textBox2&amp;quot;/&amp;gt;
&amp;lt;Label&amp;gt;
	&amp;lt;Label.Content&amp;gt;
		&amp;lt;MultiBinding Converter=&amp;quot;{con:FormatConverter {}You said {0} and {1}.}&amp;quot;&amp;gt;
			&amp;lt;Binding Path=&amp;quot;Text&amp;quot; ElementName=&amp;quot;_textBox1&amp;quot;/&amp;gt;
			&amp;lt;Binding Path=&amp;quot;Text&amp;quot; ElementName=&amp;quot;_textBox2&amp;quot;/&amp;gt;
		&amp;lt;/MultiBinding&amp;gt;
	&amp;lt;/Label.Content&amp;gt;
&amp;lt;/Label&amp;gt;
&lt;/pre&gt;&lt;a name="DateTimeConverter"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
DateTimeConverter
&lt;/h2&gt;The &lt;span class="codeInline"&gt;DateTimeConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;DateTimeConverterExtension&lt;/span&gt; classes allow you to perform specialized conversions on &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s during data binding. Using these classes, you can do any of the following:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Convert between different kinds of &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s (e.g. convert between UTC and local time).&lt;/li&gt;&lt;li&gt;Convert between different kinds of &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s without changing the underlying &lt;span class="codeInline"&gt;DateTime&lt;/span&gt; value (i.e. convert by using &lt;span class="codeInline"&gt;DateTime.SpecifyKind()&lt;/span&gt; instead of &lt;span class="codeInline"&gt;ToLocalTime()&lt;/span&gt; or &lt;span class="codeInline"&gt;ToUniversalTime()&lt;/span&gt;).&lt;/li&gt;&lt;li&gt;Adjust &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s during conversion by adding a &lt;span class="codeInline"&gt;TimeSpan&lt;/span&gt; to them.&lt;/li&gt;
&lt;/ul&gt;The &lt;span class="codeInline"&gt;DateTimeConverter&lt;/span&gt; supports both forward and backwards conversions. This allows you, for example, to store &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;s in UTC format in your business objects but convert them to local time prior to using them in your interface. The following example shows how you could achieve this (and assumes the existence of a WPF &lt;span class="codeInline"&gt;DatePicker&lt;/span&gt; class):&lt;br /&gt;&lt;pre&gt;
&amp;lt;DatePicker Value=&amp;quot;{Binding StartDate, Converter={con:DateTimeConverter TargetKind=Local, SourceKind=Utc}}&amp;quot;/&amp;gt;
&lt;/pre&gt;&lt;a name="MapConverter"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
MapConverter
&lt;/h2&gt;The &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; class (which has no corresponding markup extension) can be used to map one set of values to another. This is an extremely useful converter that has many use cases. Here are some examples:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Converting enumeration values to human-readable strings prior to display.&lt;/li&gt;&lt;li&gt;Converting between &lt;span class="codeInline"&gt;bool&lt;/span&gt; values and &lt;span class="codeInline"&gt;Visibility&lt;/span&gt; enumeration values.&lt;/li&gt;&lt;li&gt;Converting between &lt;span class="codeInline"&gt;bool&lt;/span&gt; values and an &lt;span class="codeInline"&gt;ImageSource&lt;/span&gt; so the user sees a tick or a cross depending on the &lt;span class="codeInline"&gt;bool&lt;/span&gt; value.&lt;/li&gt;
&lt;/ul&gt;The &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; works by using a collection of &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; objects. Each &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; object specifies a value to map &lt;i&gt;from&lt;/i&gt; and a value to map &lt;i&gt;to&lt;/i&gt;. The same &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; objects are used both for forward conversions and backward conversions.&lt;br /&gt;If no relevant &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; object can be found during a conversion, the &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; uses its &lt;span class="codeInline"&gt;FallbackBehavior&lt;/span&gt; property to decide what to do. You can tell it to either return &lt;span class="codeInline"&gt;DependencyProperty.UnsetValue&lt;/span&gt; or to return the value it was asked to convert.&lt;br /&gt;An example should make this all clear:&lt;br /&gt;&lt;pre&gt;
&amp;lt;Label&amp;gt;
	&amp;lt;Label.Content&amp;gt;
		&amp;lt;Binding Path=&amp;quot;Gender&amp;quot;&amp;gt;
			&amp;lt;Binding.Converter&amp;gt;
				&amp;lt;con:MapConverter&amp;gt;
					&amp;lt;con:Mapping From=&amp;quot;{x:Static Gender.Male}&amp;quot; To=&amp;quot;Guy&amp;quot;/&amp;gt;
					&amp;lt;con:Mapping From=&amp;quot;{x:Static Gender.Female}&amp;quot; To=&amp;quot;Gal&amp;quot;/&amp;gt;
				&amp;lt;/con:MapConverter&amp;gt;
			&amp;lt;/Binding.Converter&amp;gt;
		&amp;lt;/Binding&amp;gt;
	&amp;lt;/Label.Content&amp;gt;
&amp;lt;/Label&amp;gt;
&lt;/pre&gt;This example uses a &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; to convert from members in a &lt;span class="codeInline"&gt;Gender&lt;/span&gt; enumeration to either &amp;quot;Guy&amp;quot; or &amp;quot;Gal&amp;quot;. Now suppose that the &lt;span class="codeInline"&gt;Gender&lt;/span&gt; enumeration also defines a value of &lt;span class="codeInline"&gt;Unknown&lt;/span&gt; (a wise move in these modern times). The above mapping won’t successfully convert values of &lt;span class="codeInline"&gt;Unknown&lt;/span&gt; – it will just return &lt;span class="codeInline"&gt;DependencyProperty.UnsetValue&lt;/span&gt; instead.&lt;br /&gt;If you want unknown genders to display as &amp;quot;Unknown&amp;quot; you can either add another &lt;span class="codeInline"&gt;Mapping&lt;/span&gt; or just tell the &lt;span class="codeInline"&gt;MapConverter&lt;/span&gt; to return the original value if it cannot map the value it is given:&lt;br /&gt;&lt;pre&gt;
&amp;lt;con:MapConverter FallbackBehavior=&amp;quot;ReturnOriginalValue&amp;quot;&amp;gt;
	&amp;lt;con:Mapping From=&amp;quot;{x:Static Gender.Male}&amp;quot; To=&amp;quot;Guy&amp;quot;/&amp;gt;
	&amp;lt;con:Mapping From=&amp;quot;{x:Static Gender.Female}&amp;quot; To=&amp;quot;Gal&amp;quot;/&amp;gt;
&amp;lt;/con:MapConverter&amp;gt;
&lt;/pre&gt;A &lt;span class="codeInline"&gt;FallbackBehavior&lt;/span&gt; of &lt;span class="codeInline"&gt;ReturnOriginalValue&lt;/span&gt; is extremely useful where you only want to map a subset of the total possible values.&lt;br /&gt;&lt;a name="ExpressionConverter"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
ExpressionConverter
&lt;/h2&gt;The &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;ExpressionConverterExtension&lt;/span&gt; classes allow you to convert one or more bound values by running them through a C#-like expression. The expression uses placeholders of the form &lt;span class="codeInline"&gt;{x&lt;/span&gt;} to demarcate bound arguments, where &lt;span class="codeInline"&gt;x&lt;/span&gt; is the argument number starting at zero.&lt;br /&gt; &lt;br /&gt;Let’s start with something simple:&lt;br /&gt;&lt;pre&gt;
&amp;lt;Canvas&amp;gt;
	&amp;lt;Slider x:Name=&amp;quot;_slider&amp;quot; Width=&amp;quot;300&amp;quot; Minimum=&amp;quot;1&amp;quot; Maximum=&amp;quot;100&amp;quot;/&amp;gt;
	&amp;lt;Rectangle Canvas.Top=&amp;quot;20&amp;quot; Fill=&amp;quot;Red&amp;quot; Width=&amp;quot;100&amp;quot; Height=&amp;quot;{Binding Value, ElementName=_slider}&amp;quot;/&amp;gt;
	&amp;lt;Rectangle Canvas.Top=&amp;quot;100&amp;quot; Fill=&amp;quot;Blue&amp;quot; Width=&amp;quot;100&amp;quot; Height=&amp;quot;{Binding Value, ElementName=_slider, Converter={con:ExpressionConverter {}{0} * 2}}&amp;quot;/&amp;gt;
&amp;lt;/Canvas&amp;gt;
&lt;/pre&gt;In this example, the value of the &lt;span class="codeInline"&gt;Slider&lt;/span&gt; dictates the height of the first rectangle. It also dictates the height of the second rectangle, but an &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; is used to double the value first.&lt;br /&gt; &lt;br /&gt;Notice how the expression passed to the &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; is escaped with &amp;quot;{}&amp;quot;. As with the FormatConverter, this is necessary because it includes the &amp;quot; and &amp;quot; characters. The expression on its own is simply &lt;span class="codeInline"&gt;&amp;quot;{0} * 2&amp;quot;&lt;/span&gt;. In English, this means &amp;quot;multiply the first argument by two&amp;quot;.&lt;br /&gt; &lt;br /&gt;Now, let’s do something a little more complex:&lt;br /&gt;&lt;pre&gt;
&amp;lt;StackPanel x:Name=&amp;quot;_panel&amp;quot;&amp;gt;
	&amp;lt;Label&amp;gt;What bands do you like?&amp;lt;/Label&amp;gt;
	&amp;lt;CheckBox x:Name=&amp;quot;_rammstein&amp;quot;&amp;gt;Rammstein&amp;lt;/Label&amp;gt;
	&amp;lt;CheckBox x:Name=&amp;quot;_powderfinger&amp;quot;&amp;gt;Powderfinger&amp;lt;/Label&amp;gt;
	&amp;lt;CheckBox x:Name=&amp;quot;_nickelback&amp;quot;&amp;gt;Nickelback&amp;lt;/Label&amp;gt;
	&amp;lt;CheckBox x:Name=&amp;quot;_ministry&amp;quot;&amp;gt;Ministry&amp;lt;/Label&amp;gt;
	&amp;lt;Button Content=&amp;quot;Let me in!&amp;quot;&amp;gt;
		&amp;lt;Button.IsEnabled&amp;gt;
			&amp;lt;MultiBinding Converter=&amp;quot;{ExpressionConverter {}{0} &amp;amp;amp;&amp;amp;amp; {1} &amp;amp;amp;&amp;amp;amp; {3} &amp;amp;amp;&amp;amp;amp; !{2}}&amp;quot;&amp;gt;
				&amp;lt;Binding Path=&amp;quot;IsChecked&amp;quot; ElementName=&amp;quot;_rammstein&amp;quot;/&amp;gt;
				&amp;lt;Binding Path=&amp;quot;IsChecked&amp;quot; ElementName=&amp;quot;_powderfinger&amp;quot;/&amp;gt;
				&amp;lt;Binding Path=&amp;quot;IsChecked&amp;quot; ElementName=&amp;quot;_nickelback&amp;quot;/&amp;gt;
				&amp;lt;Binding Path=&amp;quot;IsChecked&amp;quot; ElementName=&amp;quot;_ministry&amp;quot;/&amp;gt;
			&amp;lt;/MultiBinding&amp;gt;
		&amp;lt;/Button.IsEnabled&amp;gt;
	&amp;lt;/Button&amp;gt;
&amp;lt;/StackPanel&amp;gt;
&lt;/pre&gt;In this example, the entry button is only enabled if the correct combination of bands is chosen. If you don’t like one of the good bands or if you &lt;i&gt;do&lt;/i&gt; like the sucky band, you won’t be allowed in.&lt;br /&gt; &lt;br /&gt;The actual expression has again been escaped due to its presence in XAML. Unescaped, it is simply &lt;span class="codeInline"&gt;&amp;quot;{0} &amp;amp;&amp;amp; {1} &amp;amp;&amp;amp; {3} &amp;amp;&amp;amp; !{2}&amp;quot;. An alternative approach that avoids all this escaping is to use a more long-winded syntax in the {{MultiBinding&lt;/span&gt; as follows:&lt;br /&gt;&lt;pre&gt;
&amp;lt;MultiBinding&amp;gt;
	&amp;lt;MultiBinding.Converter&amp;gt;
		&amp;lt;con:ExpressionConverterExtension&amp;gt;
			&amp;lt;con:ExpressionConverterExtension.Expression&amp;gt;
				&amp;lt;![CDATA[
				{0} &amp;amp;&amp;amp; {1} &amp;amp;&amp;amp; {3} &amp;amp;&amp;amp; !{2}
				]]&amp;gt;
			&amp;lt;/con:ExpressionConverterExtension.Expression&amp;gt;
		&amp;lt;/con:ExpressionConverterExtension&amp;gt;
	&amp;lt;/MultiBinding.Converter&amp;gt;
&amp;lt;/MultiBinding&amp;gt;
&lt;/pre&gt;The &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; supports a lot of C# operators and we’ve only scratched the surface of the possibilities here. Please see the API documentation for a full list of supported operators.&lt;br /&gt;&lt;a name="AWord"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;
A Word on the ExpressionConverter’s Parser
&lt;/h3&gt;I am not going to go into detail here on the implementation of the parser behind the &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt;. For a good overview on writing a code parser, you should check out &lt;a href="Tommy%20Carlier%e2%80%99s%20series" class="externalLink"&gt;http://tommycarlier.blogspot.com/2007/05/writing-parser-overview.html&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; or any good book on compiler construction. However, I would like to point out a few things.&lt;br /&gt; &lt;br /&gt;Firstly, I did not leverage .NET’s C# CodeDom implementation to parse the expressions. This was due to the imposed security restrictions. I want the &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; to be usable in low trust applications (including Silverlight).&lt;br /&gt; &lt;br /&gt;Secondly, I did not leverage ANTLR to generate the parser because then my library would have a dependency of the .NET ANTLR runtime. This was not an option as I was trying to keep the overhead of my library to a minimum. Of course, I did experiment with both CodeDom and ANTLR prior to implementing the parser. This gave me some insights and helped me formulate goals for the parser. Some things that are not supported by my implementation are:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Verbatim &lt;span class="codeInline"&gt;string&lt;/span&gt;s (i.e. strings starting with &lt;span class="codeInline"&gt;@&lt;/span&gt;).&lt;/li&gt;&lt;li&gt;Hexadecimal or Unicode escape sequences in &lt;span class="codeInline"&gt;string&lt;/span&gt;s (but common escape sequences such as &lt;span class="codeInline"&gt;\n&lt;/span&gt; and &lt;span class="codeInline"&gt;\t&lt;/span&gt; are supported).&lt;/li&gt;&lt;li&gt;Property accessors (e.g. an expression such as &lt;span class="codeInline"&gt;&amp;quot;{0}.Age &amp;gt; 18&amp;quot;&lt;/span&gt; will not work).&lt;/li&gt;&lt;li&gt;Array indexers (e.g. an expression such as &lt;span class="codeInline"&gt;&amp;quot;{0}[0] &amp;gt; {0}[1]&amp;quot;&lt;/span&gt; will not work).&lt;/li&gt;&lt;li&gt;Branching statements (and in particular, no ternary operator).&lt;/li&gt;
&lt;/ul&gt;These features were left out consciously: either because of space constraints, concerns about abuse, or concerns about the efficiency of an interpretive implementation. If you feel there is good reason to include some of these features then please let me know. If you make a strong case I may well add your feature of choice.&lt;br /&gt; &lt;br /&gt;Finally, as I hinted at above, the current implementation of the parser functions as an interpreter. It does not yet leverage .NET’s &lt;span class="codeInline"&gt;DynamicMethod&lt;/span&gt; class to produce compiled output, but it may in the future . Note that expressions given to the &lt;span class="codeInline"&gt;ExpressionConverter&lt;/span&gt; are parsed only once. After being parsed, the same abstract syntax tree (AST) is used to evaluate the expression any number of times. Having said that, evaluation of the expressions will be slower than an otherwise equivalent implementation based on &lt;span class="codeInline"&gt;DynamicMethod&lt;/span&gt;. If this proves to be a problem in the real world then I may change the implementation.&lt;br /&gt;&lt;a name="ConverterGroup"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
ConverterGroup
&lt;/h2&gt;The &lt;span class="codeInline"&gt;Binding&lt;/span&gt; class only allows you to provide one converter. The &lt;span class="codeInline"&gt;ConverterGroup&lt;/span&gt; class allows you to construct a pipeline of converters that can be assigned to a &lt;span class="codeInline"&gt;Binding&lt;/span&gt;, which essentially annuls this restriction. Here’s an example:&lt;br /&gt;&lt;pre&gt;
&amp;lt;TextBox x:Name=”_textBox”/&amp;gt;
&amp;lt;Label&amp;gt;
	&amp;lt;Label.Content&amp;gt;
		&amp;lt;Binding Path=”Text” ElementName=”_textBox”&amp;gt;
			&amp;lt;Binding.Converter&amp;gt;
				&amp;lt;con:ConverterGroup&amp;gt;
					&amp;lt;con:CaseConverter Casing=”Upper”/&amp;gt;
					&amp;lt;con:FormatConverter FormatString=”In uppercase, you entered ‘{0}’.”/&amp;gt;
				&amp;lt;/con:ConverterGroup&amp;gt;
			&amp;lt;/Binding.Converter&amp;gt;
		&amp;lt;/Binding&amp;gt;
	&amp;lt;/Label.Content&amp;gt;
&amp;lt;/Label&amp;gt;
&lt;/pre&gt;In this example, any input in the &lt;span class="codeInline"&gt;TextBox&lt;/span&gt; is first converted to uppercase with the &lt;span class="codeInline"&gt;CaseConverter&lt;/span&gt; and then formatted via the &lt;span class="codeInline"&gt;FormatConverter&lt;/span&gt;. If all converters in the pipeline support backward conversions (not so in this case) then the &lt;span class="codeInline"&gt;ConverterGroup&lt;/span&gt; will also support backwards conversions.&lt;br /&gt;&lt;a name="MultiConverterGroup"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
MultiConverterGroup
&lt;/h2&gt;The &lt;span class="codeInline"&gt;MultiConverterGroup&lt;/span&gt; class has the same goals as the &lt;span class="codeInline"&gt;ConverterGroup&lt;/span&gt; class except that it is an implementation of &lt;span class="codeInline"&gt;IMultiValueConverter&lt;/span&gt; rather than &lt;span class="codeInline"&gt;IValueConverter&lt;/span&gt;. It works with a pipeline of steps (represented by instances of &lt;span class="codeInline"&gt;MultiConverterGroupStep&lt;/span&gt;). Each step can have any number of multi-value converters in it. The output from each step is the combined output from each converter in the step. This output is then fed into the next step.&lt;br /&gt; &lt;br /&gt;If your head hurts from reading that (mine sure does after writing it) then perhaps this diagram will help:&lt;br /&gt;&lt;span class="unresolved"&gt;Cannot resolve link: &lt;/span&gt;[image:MultiConverterGroup.png]&lt;br /&gt;The above example defines three steps in the conversion pipeline. The &lt;span class="codeInline"&gt;MultiConverterGroup&lt;/span&gt; combines objects output from the converters in &lt;i&gt;Step 1&lt;/i&gt; and uses that as the input to &lt;i&gt;Step 2&lt;/i&gt;. Similarly, the output from &lt;i&gt;Step 2&lt;/i&gt; is fed into &lt;i&gt;Step 3&lt;/i&gt;. The XAML for this example would look like this:&lt;br /&gt;&lt;pre&gt;
&amp;lt;con:MultiConverterGroup&amp;gt;
	&amp;lt;MultiConverterGroupStep&amp;gt;
		&amp;lt;Converter1/&amp;gt;
		&amp;lt;Converter2/&amp;gt;
		&amp;lt;Converter3/&amp;gt;
	&amp;lt;/MultiConverterGroupStep&amp;gt;
	&amp;lt;MultiConverterGroupStep&amp;gt;
		&amp;lt;Converter4/&amp;gt;
		&amp;lt;Converter5/&amp;gt;
		&amp;lt;Converter6/&amp;gt;
	&amp;lt;/MultiConverterGroupStep&amp;gt;
	&amp;lt;MultiConverterGroupStep&amp;gt;
		&amp;lt;Converter7/&amp;gt;
	&amp;lt;/MultiConverterGroupStep&amp;gt;
&amp;lt;/con:MultiConverterGroup&amp;gt;
&lt;/pre&gt;Note that the last step must always have exactly one converter, which makes sense because at the end of the day the pipeline needs to produce a single value. If you violate this constraint, you’ll get an exception.&lt;br /&gt; &lt;br /&gt;So that covers forward conversions, but what about backward conversions? If you examine the diagram, you’ll realize that a backward conversion starts at the bottom and heads toward the top, but could take one of many paths. In theory, if all converters are implemented correctly and they all support backward conversions, then any path from the bottom to the top with the same input would yield the same output.&lt;br /&gt; &lt;br /&gt;In practice, the &lt;span class="codeInline"&gt;MultiConverterGroup&lt;/span&gt; solves this ambiguity by leaning on the left-hand side of the path when converting backwards. In the example, it will pass output from &lt;span class="codeInline"&gt;Converter7&lt;/span&gt; into &lt;span class="codeInline"&gt;Converter4&lt;/span&gt; and then pass the output from that into &lt;span class="codeInline"&gt;Converter1&lt;/span&gt;.&lt;br /&gt;&lt;a name="TypeConverter"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;
TypeConverter
&lt;/h2&gt;The &lt;span class="codeInline"&gt;TypeConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;TypeConverterExtension&lt;/span&gt; classes provide the ability to convert input values to different types. It is essentially a public implementation of the &lt;span class="codeInline"&gt;internal DefaultValueConverter&lt;/span&gt; and &lt;span class="codeInline"&gt;SystemConvertConverter&lt;/span&gt; BCL types. It is useful in coercing a value to required type during a pipeline conversion using &lt;span class="codeInline"&gt;ConverterGroup&lt;/span&gt;. Using it is straightforward:&lt;br /&gt;&lt;pre&gt;
&amp;lt;Label&amp;gt;
	&amp;lt;Label.Content&amp;gt;
		&amp;lt;Binding Path=”Dob”&amp;gt;
			&amp;lt;Binding.Converter&amp;gt;
				&amp;lt;con:ConverterGroup&amp;gt;
					&amp;lt;con:TypeConverter TargetType=”{x:Type sys:DateTime}”/&amp;gt;
					&amp;lt;con:DateTimeConverter TargetKind=”Local”/&amp;gt;
				&amp;lt;/con:ConverterGroup&amp;gt;
			&amp;lt;/Binding.Converter&amp;gt;
		&amp;lt;/Binding&amp;gt;
	&amp;lt;/Label.Content&amp;gt;
&amp;lt;/Label&amp;gt;
&lt;/pre&gt;In this highly fabricated example, there is a &lt;span class="codeInline"&gt;Dob&lt;/span&gt; property that is a &lt;span class="codeInline"&gt;string&lt;/span&gt; when it really should be a &lt;span class="codeInline"&gt;DateTime&lt;/span&gt;. A &lt;span class="codeInline"&gt;TypeConverter&lt;/span&gt; is used to convert the &lt;span class="codeInline"&gt;string&lt;/span&gt; to a &lt;span class="codeInline"&gt;DateTime&lt;/span&gt; prior to feeding it into a &lt;span class="codeInline"&gt;DateTimeConverter&lt;/span&gt;.&lt;br /&gt; &lt;br /&gt;The &lt;span class="codeInline"&gt;TypeConverter&lt;/span&gt; will first attempt to convert data by way of an &lt;span class="codeInline"&gt;IConvertible&lt;/span&gt; implementation. If the value does not implement &lt;span class="codeInline"&gt;IConvertible&lt;/span&gt; then an attempt will be made to use any &lt;span class="codeInline"&gt;System.ComponentModel.TypeConverter&lt;/span&gt; implementation type for the class. If all attempts to convert the value fail, &lt;span class="codeInline"&gt;DependencyProperty.UnsetValue&lt;/span&gt; will be returned.&lt;br /&gt;&lt;a name="DataBindingAndConverters"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;
Data Binding and Converters
&lt;/h1&gt;The observant among you may have noticed that my converter implementations inherit from &lt;span class="codeInline"&gt;DependencyObject&lt;/span&gt; and define their properties as &lt;span class="codeInline"&gt;DependencyProperty&lt;/span&gt;s. You may see this and try something like:&lt;br /&gt;&lt;pre&gt;
&amp;lt;Label&amp;gt;
	&amp;lt;Label.Content&amp;gt;
		&amp;lt;Binding Path=”Name”&amp;gt;
			&amp;lt;Binding.Converter&amp;gt;
				&amp;lt;con:CaseConverter Casing=”{Binding Casing}”/&amp;gt;
			&amp;lt;/Binding.Converter&amp;gt;
		&amp;lt;/Binding&amp;gt;
	&amp;lt;/Label.Content&amp;gt;
&amp;lt;/Label&amp;gt;
&lt;/pre&gt;Alas, this won’t work, at least with the current version of WPF. You’ll get an error:&lt;br /&gt;&lt;pre&gt;
Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Casing; DataItem=null; target element is 'CaseConverter'
&lt;/pre&gt;So why did I bother with &lt;span class="codeInline"&gt;DependencyObject&lt;/span&gt;s? Well, if you really need to bind properties on your converters you can use &lt;a href="Josh%20Smith%e2%80%99s%20virtual%20branch%20technique" class="externalLink"&gt;http://www.codeproject.com/WPF/AttachingVirtualBranches.asp&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; to do so.&lt;br /&gt;
&lt;/div&gt;</description><author>kentcb</author><pubDate>Sat, 12 Jan 2008 17:23:53 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: User Documentation 20080112052353P</guid></item><item><title>UPDATED WIKI: Home</title><link>http://www.codeplex.com/wpfconverters/Wiki/View.aspx?title=Home&amp;version=4</link><description>&lt;div class="wikidoc"&gt;
This project contains a set of generic WPF binding converters that can be used in most any WPF application. You can read an overview of the functionality in the &lt;a href="http://www.codeplex.com/wpfconverters/Wiki/View.aspx?title=User%20Documentation&amp;amp;referringTitle=Home"&gt;user documentation&lt;/a&gt;. Complete API documentation is also available in the &lt;a href="http://www.codeplex.com/wpfconverters/Release/ProjectReleases.aspx" class="externalLink"&gt;releases&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; section.&lt;br /&gt;
&lt;/div&gt;</description><author>kentcb</author><pubDate>Sat, 12 Jan 2008 17:11:31 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Home 20080112051131P</guid></item><item><title>UPDATED WIKI: Home</title><link>http://www.codeplex.com/wpfconverters/Wiki/View.aspx?title=Home&amp;version=3</link><description>&lt;div class="wikidoc"&gt;
This project contains a set of generic WPF binding converters that can be used in most any WPF application. The code supports my article &lt;a href="http://www.codeproject.com/KB/WPF/WPF_Converters.aspx" class="externalLink"&gt;WPF Converters&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;. Documentation is available via the article and API documentation is available in the latest release.&lt;br /&gt;
&lt;/div&gt;</description><author>kentcb</author><pubDate>Sat, 22 Dec 2007 15:25:06 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Home 20071222032506P</guid></item><item><title>UPDATED WIKI: Home</title><link>http://www.codeplex.com/wpfconverters/Wiki/View.aspx?title=Home&amp;version=2</link><description>&lt;div class="wikidoc"&gt;
This project contains a set of generic WPF binding converters that can be used in most any WPF application. The code supports my article &lt;a href="http://www.codeproject.com/KB/WPF/WPF_Converters.aspx" class="externalLink"&gt;WPF Converters&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;. For now at least, documentation is available solely via the article.&lt;br /&gt;
&lt;/div&gt;</description><author>kentcb</author><pubDate>Fri, 21 Dec 2007 19:40:57 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Home 20071221074057P</guid></item></channel></rss>