Один из способов - привязать текстовый блок непосредственно к 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
}