2010-12-01 3 views
3

J'ai un MyUserControl qui contient une étiquette label et une BO public Person Person {get;set;}.Implémentation d'une liaison personnalisée

Je veux que Name de la personne se lie toujours à la label comme ceci:

("Name: {0}", person.Name), au cas où person != null
et
("Name: {0}", "(none)"), dans le cas si person == null

plus Si le nom de la personne est modifié, l'étiquette le met automatiquement à jour.

est-il une possibilité pour une telle liaison ?

variante "sale":

private void label_LayoutUpdated(object sender, EventArgs e) 
{ 
    label.Content = string.Format("Name: {0}", _Person == null ? 
                 "(none)" : _Person.Name); 
} 

Répondre

1

Ce problème peut être résolu en écrivant un convertisseur de valeur.

[ValueConversion(typeof(Person), typeof(String))] 
public class PersonNameConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     Person person = value as Person; 
     if(person == null) 
     { 
      return "(none)"; 
     } 
     else 
     { 
      return person.Name; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Une fois que vous avez créé, vous pouvez l'ajouter en tant que ressource dans le XAML:

<local:PersonNameConverter x:Key="PersonNameConverter"/> 

cela peut être inclus comme l'un des paramètres de liaison

<TextBlock 
    Text="{Binding Path=ThePerson, Converter={StaticResource PersonNameConverter}}" 
    /> 
+0

cela ne concerne pas la propriété "Name" (NullorEmpty), mais la personne un. – serhio

+0

@serhio: Mon erreur. J'ai changé le code en conséquence. –

+0

Existe-t-il une restriction à la classe Person? Devrait-il implémenter INotifyPropetyChanged ou d'autres choses? parce que mes classes BO sont simples – serhio

3

Comment environ:

<StackPanel Orientation="Horizontal"> 
     <TextBlock Text="Name: "/> 
     <TextBlock Text="{Binding Person.Name, FallbackValue='(none)'}"/> 
    </StackPanel> 

Ceci fait n'utilisez pas d'étiquette, mais cela permet d'atteindre l'objectif.


Si elle doit être une étiquette, vous pouvez le faire:

<Label Content="{Binding Person.Name, FallbackValue='(none)'}" 
      ContentStringFormat="Name: {0}"/> 

Une mise en garde avec les deux approches est que le texte affiche également Name: (none) si la liaison est incorrect (personne == null est un comportement équivalent à aucune propriété Personne trouvée).

+0

+1 Une réponse parfaite. Je ne savais pas à propos de FallbackValue. – Liz

+0

+1 pour 'ContentStringFormat' – serhio

+0

est-ce que' Person.Name' devrait implémenter INotifyPropertyChanged ou des trucs comme ça? – serhio

0

utilisation Reliure FallBackValue propriété

 <Lable Content ="{Binding Person.Name, FallbackValue='(none)'}"/> 
+0

cela implique que Person.Name soit lisible ... pas nécessairement pour un BO ... – serhio

Questions connexes