2009-04-11 9 views
7

J'ai un DataGrid et un Expander comme ceci:Reliure StringFormat ne semble pas fonctionner correctement

<StackPanel> 
<my:DataGrid Name="dataGrid1" AutoGenerateColumns="False" ItemsSource="{Binding}">...</my:DataGrid> 
<Expander Header="{Binding ElementName=dataGrid1, Path=SelectedItem.Name, StringFormat=Details of {0}}">...</Expander> 
</StackPanel> 

La liaison est très bien, mais pour une raison quelconque la mise en forme de chaîne ne fonctionnera pas. Il affiche toujours que la valeur dataGrid1.SelectedItem.Name J'ai aussi essayé:

StringFormat=Details of \{0\} 

qui ne fonctionne pas.

J'ai même essayé simplement de définir la propriété HeaderStringFormat de l'Expander sur "Details of {0}" mais cela ne le formate pas non plus.

j'ai pu obtenir cette solution de contournement pour travailler si:

<Expander> 
<Expander.Header> 
<TextBox Text="{Binding ElementName=dataGrid1, Path=SelectedItem.Name, StringFormat=Details of {0}}"></TextBox> 
</Expander.Header> 
</Expander> 

que quelqu'un sait pourquoi StringFormat ne fonctionne pas pour la propriété d'en-tête?

Répondre

4

Selon http://codingcontext.wordpress.com/2008/11/17/headerformatstring-and-contentformatstring/, il ressemble à la propriété HeaderStringFormat n'est pas destiné à être utilisé avec le format de chaîne de liaison, mais plutôt pour spécifier le format à utiliser lors de la liaison à un objet qui implémente IFormattable. Etant donné cela, je ne pouvais pas obtenir la mise en forme de chaîne pour travailler directement dans l'expression de liaison, ce qui pourrait être un bogue. Vous devriez essayer de notifier Microsoft et peut-être qu'ils vont le réparer.

Avec votre solution, je suggère d'utiliser un TextBlock plutôt que d'un TextBox, puisque vous ne voulez probablement pas à l'utilisateur de pouvoir modifier le texte dans l'en-tête Expander.

+0

Très bien, c'est informatif. Merci. En outre, j'utilise un TextBlock ... Je pense que je l'ai juste mal écrit quand j'ai fait le post. – Adam

0

Cela peut avoir quelque chose à voir avec Header étant une propriété de type Object plutôt que String. La conversion de la valeur String en contrôle d'interface utilisateur peut interférer avec le formatage. Plutôt que TextBox, Label fonctionne-t-il également? Cela devrait vous donner le même effet que ce que vous essayiez initialement de faire.

Mise à jour: Essayez aussi la recherche dans la propriété HeaderStringFormat.

+0

Vous avez un point sur les en-tête étant un objet et TextBox.Text étant une chaîne. J'ai juste essayé avec un label, cependant, et cela a fonctionné quand j'ai placé le ContentFormatString à ce que je voulais. La propriété Label Content est aussi un objet donc je ne comprends toujours pas ... quelque chose d'étrange avec l'en-tête. – Adam

3

J'ai aussi rencontré le même problème et après avoir lu certains articles, en essayant toutes sortes de ContentStringFormat et HeaderStringFormat je viens décidé de faire la chose suivante:

<Expander Grid.Row="1" Padding="4"> 
       <Expander.Header> 
       <TextBlock Text="{Binding ElementName=cbCategory, Path=SelectedItem.CategoryName, StringFormat='FORMATTED &quot;{0}&quot;'}"/> 
       </Expander.Header> 
Questions connexes