Привязка данных к значению multiBinding - PullRequest
2 голосов
/ 22 июля 2010

Может быть, я не совсем понимаю мультибиндинги.

У меня есть свойство в моей модели представления с именем OfficeDisplayName, которое записывается в базу данных.

Это составное поле, основанное на имени, фамилии и местонахождении человека.

Итак, у меня есть мультисвязывание с textBlock ... нет, бигги ... прекрасно работает ... но как мне связать полное значение этого объединения со свойством OfficeDisplayName? Нужно ли иметь скрытый элемент, который привязывается к многосвязному текстовому полю? Я видел несколько примеров, которые почти то, что мне нужно, но просто не отвечаю на конкретный вопрос о привязке данных.

1 Ответ

7 голосов
/ 22 июля 2010

Один из способов - привязать текстовый блок непосредственно к OfficeDisplayName, а затем поместить логику конкатенации в свойстве OfficeDisplayName вашей модели представления вместо MultiValueConverter. Поэтому, когда когда-либо изменяется одно из свойств FirstName, LastName или местоположения офиса, вы запускаете событие PropertyChanged для OfficeDisplayName, то есть что-то вроде следующего: Таким образом, вам вообще не понадобится конвертер:

class YourViewModel : ViewModel
{
    string _firstName;

    public string FirstName
    {
        get { return _firstName; }
        set
        {
            if (_firstName != value)
            {
                _firstName = value;
                OnPropertyChanged("FirstName");
                OnPropertyChanged("OfficeDisplayName");
            }
        }
    }

    // More properties here
    // ...

    public string OfficeDisplayName
    {
        get { return String.Join(" ", new string[] { _firstName, _lastName, _officeLocation}); }
    }
}

Другой способ - передать саму вашу модель представления в качестве параметра вашему MultiValueConverter. В вашем конвертере вы можете установить значение OfficeDisplayName напрямую. Я думаю, что этот способ немного "взломан", но это вопрос вкуса. Ваш код будет выглядеть следующим образом:

Связывание в XAML:

<MultiBinding Converter="{StaticResource theConverter}" Mode="OneWay">
    <Binding /> <!-- Pass the datacontext as the first parameter -->
    <Binding Path="FirstName" />
    <Binding Path="LastName" />
</MultiBinding>

Конвертер:

class TheMultiValueConverter : IMultiValueConverter
{
    #region IMultiValueConverter Members

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var viewModel = values[0] as TheViewModel;
        var ret = String.Join(" ", values.Skip(1).Cast<string>().ToArray());
        viewModel.OfficeDisplayName = ret;
        return ret;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}
...