Thursday, August 23, 2012

.NET XAML binding more than one property

When making views using XAML and with .NET you might sometimes want to combine more than one property into a textblock (e.g. for example showing the breadcrumbs of your location in a textblock). Something like the following for example:
Location1.Title + "." + Location2.Title + "." + Location3.Title

There are several ways of doing this.

One is creating a custom converter for MultiBinding that creates the string for you, pretty well explained here:
Which seems to be the common suggestion, but it involves writing a lot of code for just one field. And you might have to do this often!

Alternatively you can just combine a bunch of textblocks:
<textblock text="{Binding Path=Location1.Title}" />
<textblock text=", " />
<textblock text="{Binding Path=Location2.Title}" />
<textblock text=", " />
<textblock text="{Binding Path=Location3.Title}" />
Which is ok, but gets messy.

Or, you can (Since .NET 3.5 SP1) use MultiBinding property StringFormat:
<TextBlock Margin="5,0,0,0">
<MultiBinding StringFormat="{}{0}, {1}, {2}">
<Binding Path="Location1.Title"/>
<Binding Path="Location2.Title"/>
<Binding Path="Location3.Title"/>

Note the empty bracket at the start of the StringFormat. When the XAML reader sees an opening bracket it reads this as the start of a markup extension (Binding). The empty bracket is an escape sequence to prevent the XAML reader from trying to interpret the {0} as a binding.
Note2: A space character will also work (" {0}, {1}, {2}").


No comments:

Post a Comment