2010-07-22 15 views
2

Peut-être que je ne comprends pas très bien les liaisons multiples.Liaison de données à la valeur d'une liaison multiple

J'ai une propriété sur mon viewmodel appelée OfficeDisplayName qui est écrite dans la base de données.

Il s'agit d'un champ concaténé basé sur le prénom, le nom et l'adresse du bureau d'une personne.

Donc, j'ai une multi-liaison sur un bloc de texte ... pas de biggie ... fonctionne magnifiquement ... mais comment puis-je lier la valeur complète de cette concaténation à la propriété OfficeDisplayName? Dois-je avoir un élément caché qui se lie à la zone de texte multi-liens? J'ai vu plusieurs exemples qui sont presque ce dont j'ai besoin, mais je ne réponds pas à la question de concaténation de données.

Répondre

7

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 
} 
+0

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

+1 pour cela - akjoshi