MultiBindings в Silverlight: присвоение множества привязок одному свойству

ОГЛАВЛЕНИЕ

Данная статья описывает метод ассоциации множества привязок с одним единственым свойством зависимости в приложениях Silverlight. WPF уже обладает данной функциональностью в виде MultiBindings, а код в приведенной статье копирует данную функциональность.

Данная статья описывает метод ассоциации множества привязок с одним единственным свойством зависимости в приложениях 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. В этом и заключается идея, тем не менее не все так просто.