One of the features I most enjoy in WPF is the MultiBinding class, which allows you to take several source properties, pass their values to an IMultiValueConverter implementation, and bind the result to a single target property!
By now you’re probably thinking “why do I need that?”, but in certain specific scenarios, having the possibility to take several values and produce a single result directly in the UI can be quite useful!
Take this sample from MSDN:
<TextBlock DataContext="{StaticResource NameListData}">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource myNameConverter}"
ConverterParameter="FormatLastFirst">
<Binding Path="FirstName"/>
<Binding Path="LastName"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
We can easily infer that the objective here is to set the TextBlock.Text
property to the result of “LastName, FirstName”, given the two properties from the specified TextBlock.DataContext
and a custom IMultiValueConverter
instance called myNameConverter.
While useful, the MultiBinding
is not available for Windows Phone developers - queue the whining…
I’ve seen a few alternative implementations around the internet, but none seems easy (and light!) enough to me, so I just decided to make my own!
On the latest release of Cimbalino Windows Phone Toolkit I added the MultiBindingBehavior, a quick and easy approach to solve the missing MultiBinding
support in Windows Phone!
Here’s an example using the same scenario from above:
<TextBlock DataContext="{StaticResource NameListData}">
<i:Interaction.Behaviors>
<cimbalinoBehaviors:MultiBindingBehavior Converter="{StaticResource myNameConverter}" ConverterParameter="FormatLastFirst" PropertyName="Text">
<cimbalinoBehaviors:MultiBindingItem Value="{Binding FirstName}" />
<cimbalinoBehaviors:MultiBindingItem Value="{Binding LastName}" />
</cimbalinoBehaviors:MultiBindingBehavior>
</i:Interaction.Behaviors>
</TextBlock>
The major difference here is the usage of MultiBindingBehavior.PropertyName
, as we can’t bind the target property directly, it will be up to the behavior to get/set the value. All the rest of the code is really quite self explanatory!
Here’s another sample using two TextBox controls to input the FirstName and LastName values:
<TextBox x:Name="FirstNameTextBox" />
<TextBox x:Name="LastNameTextBox" />
<TextBlock Style="{StaticResource PhoneTextLargeStyle}">
<i:Interaction.Behaviors>
<cimbalinoBehaviors:MultiBindingBehavior Converter="{StaticResource myNameConverter}" ConverterParameter="FormatLastFirst" PropertyName="Text">
<cimbalinoBehaviors:MultiBindingItem Value="{Binding Text, ElementName=FirstNameTextBox}" />
<cimbalinoBehaviors:MultiBindingItem Value="{Binding Text, ElementName=LastNameTextBox}" />
</cimbalinoBehaviors:MultiBindingBehavior>
</i:Interaction.Behaviors>
</TextBlock>
You can set the MultiBindingBehavior.Converter
property to any IValueConverter instance (knowing that the value
parameter is always an object[]
instance) but I’ve also added an abstract MultiValueConverterBase that you can inherit and implement quite easily!