MultiBindings в Silverlight: присвоение множества привязок одному свойству
ОГЛАВЛЕНИЕ
Данная статья описывает метод ассоциации множества привязок с одним единственным свойством зависимости в приложениях Silverlight. WPF уже обладает данной функциональностью в виде MultiBindings, а код в приведенной статье копирует данную функциональность.
Простое приложение демонстрирует данную технику, при этом у нас будет три текстовых блока для ввода данных, привязанных к индивидуальным свойствам простого объекта Person, а текстовый блок заголовка будет привязан к обоим свойствам Forename (Имя) и Surname (Фамиля). Попробуйте отредактировать фамилию или имя и вы увидите, как будет обновлен заголовок.

XAML для данного приложения выглядит примерно так (излишние свойства/элементы были опущены для ясности):
<TextBlock Foreground="White" FontSize="13">
<local:BindingUtil.MultiBinding>
<local:MultiBinding TargetProperty="Text"
Converter="{StaticResource TitleConverter}">
<Binding Path="Surname"/>
<Binding Path="Forename"/>
</local:MultiBinding>
</local:BindingUtil.MultiBinding>
</TextBlock>
<TextBlock Text="Surname:"/>
<TextBox Text="{Binding Path=Surname, Mode=TwoWay}"/>
<TextBlock Text="Forename:"/>
<TextBox Text="{Binding Path=Forename, Mode=TwoWay}"/>
<TextBlock Text="Age:"/>
<TextBox Text="{Binding Path=Age, Mode=TwoWay}"/>
Решение
Наше решение проблемы множественной привязки заключается во введении класса, MultiBinding , который ассоциируется с элементом, который обладает возможностью множественной привязки посредством привязанного свойства BindingUtil.MultiBinding. Следующая диаграмма демонстрирует эту идею:
Привязки свойств Forename и Surname являются привязками MultiBinding (какие именно свойства мы узнаем далее). MultiBinding имеет ассоциированный Converter типа IMultiValueConverter - этот класс, предоставленный клиентом, реализует процесс преобразования:
public class TitleConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
string forename = values[0] as string;
string surname = values[1] as string;
return string.Format("{0}, {1}", surname, forename);
}
}
Интерфейс IMultiValueConverter практически такой же, как IValueConverter, только в этом случае, массив объектов передается преобразователю, где каждый объект содержит текущее значение привязки для каждой привязки по порядку.
Имея данный преобразователь значений, класс MultiBinding может определить изменения в двух привязках, затем пересчитать значение ConvertedValue , которое привязано целевому свойству нашего TextBlock. В этом и заключается идея, тем не менее не все так просто.