2010-10-24 6 views
11

J'ai une collection de blocs de texte que je vais montrer et j'ai besoin que le texte de chaque bloc de texte soit affiché différemment. Je suis en train d'enregistrer la chaîne de format dans la propriété tag et j'ai besoin d'afficher le texte dans ce format. Comment lier la section StringFormat?Binding StringFormat

Quelque chose comme la section ci-dessous:

<TextBlock Tag="{Binding MyFormatString}" Text="{Binding MyProperty, StringFormat='{}{0:MyTag}'}" />

Répondre

18

Depuis BindingBase.StringFormat n'est pas une propriété de dépendance, je ne pense pas que vous pouvez lier. Si la chaîne de mise en forme varie, je crains que vous devrez recourir à quelque chose comme ça

<TextBlock Text="{Binding MyFormattedProperty}" /> 

et le formatage dans votre modèle de vue. Sinon, vous pouvez utiliser un MultiBinding et un convertisseur (exemple code non testé):

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding Converter="{StaticResource myStringFormatter}"> 
      <Binding Path="MyProperty" /> 
      <Binding Path="MyFormatString" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

public class StringFormatter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     return string.Format((string)values[1], values[0]); 
    } 
    ... 
} 
0

La chaîne de mise en forme est un paramètre d'affichage et devrait donc vivre à proximité de la couche d'interface utilisateur, vous pouvez le déclarer dans le XAML ou ont formater les propriétés de chaîne sur un ViewModel et effectuer la mise en forme dans le Get de ces propriétés et lier le TextBlock à lui les propriétés ViewModel. Il se procurerait ses données à partir de la source de données originale.

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