2010-09-24 4 views
1

J'essaie de lier une liste d'objets à une zone de liste. Chaque objet est affiché dans un bloc de texte séparé. Mais le problème est que chaque article doit être présenté dans un format différent (par exemple Date, devise, etc.). Je veux stocker le format dans une propriété de l'objet et ensuite définir le format dans la même expression de liaison où la valeur est définie. Tous les exemples que je l'ai vu à ce jour montrent comment définir le format de chaîne en dur coder:Format de chaîne différent pour chaque élément de la liste

<TextBlock Text="{Binding Value, Mode=OneWay, StringFormat=\{0:n3\}}"/>

Je me demande s'il y a un moyen de lier la propriété format de chaîne comme ceci:

<TextBlock Text="{Binding Value, Mode=OneWay, StringFormat={Binding myFormat}}"/>

Ou peut-être cela peut être réalisé en utilisant des convertisseurs de valeur. Mais encore une fois, est-il possible de lier une propriété au paramètre convertisseur comme ceci:

<TextBlock Text={Binding Value, Converter={StaticResource myConverter}, ConverterParameter={Binding myFormat}}"/>

+0

Malheureusement (la dernière fois que j'ai vérifié) Converter n'est pas un dependencyProperty donc vous ne pouvez pas le lier mais seulement lui donner une valeur fixe. –

Répondre

1

Utilisez un convertisseur de valeur qui prend tout l'objet et ont cet accès convertisseur les Value et les propriétés Format de l'objet générer la chaîne souhaitée.

Exemple: -

public class ValueFormatConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     IValueFormat vf = value as IValueFormat; 
     if (vf != null) 
      return String.Format("{0:" + vf.Format + "}", vf.Value); 
     else 
      throw new NotSupportedException("value does not implement IValueFormat"); 
    } 
} 

Demandez aux objets de la liste en œuvre IValueFormat: -

public interface IValueFormat 
{ 
    object Value { get; } 
    string Format { get; } 
} 

Vous pouvez également

Étant donné que votre objet connaît à la fois la valeur et le format à utiliser pour présenter la valeur pourquoi ne pas simplement ajouter une propriété readonly FormattedValue de type string à l'objet aussi bien?

Si vous implémentez INotifyPropertyChanged, assurez-vous simplement de déclencher PropertyChanged pour "FormattedValue" lorsque la valeur ou le format a changé.

+0

merci. Je vais essayer ta suggestion – incognito

Questions connexes