Une façon est de laisser la liaison TextBlock directement à OfficeDisplayName
puis mettre la logique de concaténation dans la propriété OfficeDisplayName
sur votre viewmodel au lieu de la MultiValueConverter
. Ainsi, lorsque l'une des propriétés FirstName, LastName ou office change, vous déclenchez l'événement PropertyChanged
pour OfficeDisplayName
, c'est-à-dire quelque chose le long des lignes suivantes. De cette façon, vous ne serez pas besoin d'un convertisseur à tous:
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}); }
}
}
Une autre façon est de passer votre viewmodel lui-même comme un paramètre à votre MultiValueConverter
. Dans votre convertisseur, vous pouvez définir la valeur de OfficeDisplayName
directement. Je pense que c'est un peu "hack-ish" mais c'est une question de goût. Votre code ressemblerait à ce qui suit:
La liaison en XAML:
<MultiBinding Converter="{StaticResource theConverter}" Mode="OneWay">
<Binding /> <!-- Pass the datacontext as the first parameter -->
<Binding Path="FirstName" />
<Binding Path="LastName" />
</MultiBinding>
Le convertisseur:
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
}
Ok ... ce qui m'a vraiment commencé alors je vous voté vers le haut. Cependant ... hehe ... Je dois enregistrer cette valeur à la base de données mais en même temps assurez-vous que je lis une valeur précise de la base de données ... donc je dois faire quelque chose dans le setter .... Je Je devine à long terme que je devrais passer le viewmodel. – ecathell
+1 pour cela - –
akjoshi