2010-07-20 19 views
0

Fondamentalement, comment lier (unidirectionnel) à une zone de texte nommée txtFullName. Initialement, tout texte dans la zone de texte est effacé/masqué puisque ToString renvoie "". Mais, lorsque je modifie FirstName ou LastName, il ne met pas à jour la liaison avec FullName. Tout moyen de le faire?WPF DataBinding: lié à une propriété qui fait référence à deux autres propriétés

De même, existe-t-il un moyen de lier à une méthode (pas seulement un champ)? En d'autres termes, définissez la liaison directement à la méthode ToString() et mettez-la à jour lorsque FirstName ou LastName change? Oh, et ce serait super génial s'il y avait une manière générique de gérer ça ... comme un attribut sur le champ FullName ou un attribut sur la méthode ToString lui indiquant quelles propriétés rechercher pour les changements.

using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.ComponentModel; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 

namespace AdvancedDataBinding 
{ 
    public class UserEntity 
    { 
     static UserEntity() 
     { 
      FirstNameProperty = DependencyProperty.Register("FirstName", typeof(String), typeof(UserEntity)); 
      LastNameProperty = DependencyProperty.Register("LastName", typeof(String), typeof(UserEntity)); 
     } 

     public String FirstName 
     { 
      get { return (String)GetValue(FirstNameProperty); } 
      set { SetValue(FirstNameProperty, value); } 
     } 
     public static readonly DependencyProperty FirstNameProperty; 

     public String LastName 
     { 
      get { return (String)GetValue(LastNameProperty); } 
      set { SetValue(LastNameProperty, value); } 
     } 
     public static readonly DependencyProperty LastNameProperty; 

     public String FullName 
     { 
      get { return ToString(); } 
     } 

     public override string ToString() 
     { 
      return FirstName + " " + LastName; 
     } 
    } 
} 

Répondre

2

Comment lier une zone de texte à plus d'une valeur: Créer une MultiValueConverter et l'utiliser pour se lier à la fois FirstName et LastName. FullName ne notifie pas lorsque FirstName ou LastName change. Dans votre classe, supprimez toute utilisation de DependencyProperty et utilisez plutôt la classe INotifyPropertyChanged. Publiez l'événement PropertyChanged pour FullName lorsque FirstName ou LastName change. Liez votre zone de texte directement à FullName.

Vérifiez ObjectDataProvider pour la "liaison" aux méthodes.

Parmi ces réponses, je vous suggère de faire le second.

+0

L'homme était sur le point de poster la même chose INotifyPropertyChanged. Pour une question posée il y a 3 heures et seulement 6 vues, je pensais avoir un show pour y répondre ...;) – aqwert

1

Vous pouvez utiliser un MultiBinding comme si ...

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding StringFormat="{}{0}, {1}"> 
      <Binding Path="LastName" /> 
      <Binding Path="FirstName" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock>