2010-09-11 10 views
0

Je pensais que ce devrait être une chose simple pour WPF, mais je ne peux pas le faire fonctionner ... J'ai une propriété int (Divisions) sur ma classe et je veux lier à une colonne DataGrid.WPF: comment lier une propriété numérique à DataGridTextColumn?

<DataGrid AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
      <DataGridTextColumn Header="Number of Divisions" Binding="{Binding Path=Divisions, StringFormat={}\{0:N0\}}" IsReadOnly="True"/>     
    </DataGrid.Columns> 
</DataGrid> 

Cependant, il n'apparaît pas. J'ai aussi essayé ce code et il ne fonctionne pas pour moi non plus:

<DataGrid AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn Header="Divisions" IsReadOnly="True"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Path=Divisions, StringFormat=C}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

Pour les tests purpse, si j'ajoute une propriété de chaîne à cette classe pour retourner une chaîne, des divisions, cela fonctionne très bien. Alors, qu'est-ce qui ne va pas ici?

Répondre

4

Intéressant ... J'ai été capable de faire fonctionner les choses facilement en utilisant l'exemple suivant (dans VS 2010, .NET 4).

Ma grille Définition:

<DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Number of Divisions" 
          Binding="{Binding Path=Divisions, StringFormat={}\{0:N0\}}" 
          IsReadOnly="True"/> 
    </DataGrid.Columns> 
</DataGrid> 

Définition du contexte des données:

this.DataContext = new List<MyItem>() { 
    new MyItem() { Divisions = 1 }, 
    new MyItem() { Divisions = 2 }, 
    new MyItem() { Divisions = 3 }, 
    new MyItem() { Divisions = 4 }, 
    new MyItem() { Divisions = 5 } 
}; 

Mes données Classe Définition:

public class MyItem { 
    public int Divisions { get; set; } 
} 

Espérons que cela aide!

+1

Merci beaucoup pour la réponse rapide. J'ai finalement compris. Le problème n'est pas dans StringFormat, mais parce que le "Divisions" est défini comme une variable publique memeber, pas comme une propriété publique. C'est l'un des nombreux membres de cette classe et je l'ai négligé. En fait, une fois que ceci est changé en propriété, cela fonctionne bien sans StringFormat (pour int). Je suis désolé pour la confusion. – miliu

+2

Pas de problème, ravi de vous aider! Aussi, si cette réponse vous a aidé à résoudre votre problème, assurez-vous de cocher la case pour la marquer comme réponse acceptée! – Pwninstein

0

Je ne crois pas que vous spécifiez correctement vos StringFormats.

Dans le premier exemple, essayez de laisser tomber les caractères d'échappement, comme ceci: StringFormat={}{0:N0}

Dans la seconde: StringFormat={}{0:C}

+0

J'ai essayé son exemple dans les deux sens (avec et sans accolades échappées) et les nombres avec des séparateurs de milliers (c'est-à-dire des virgules) sont apparus correctement dans les deux sens. Bonne pensée cependant. – Pwninstein

+0

J'ai aussi essayé plusieurs manières en utilisant StringFormat ... – miliu

+0

J'ai aussi essayé plusieurs manières en utilisant StringFormat ... Les trois suivantes retournent le même résultat: {Binding ... StringFormat = N1}, {Binding ... StringFormat = \ {0 : N1 \}}, et {Binding ... StringFormat = {} \ {0: N1 \}}. Fait intéressant, dans le second cas, si je laisse tomber les caractères d'échappement, le compilateur va se plaindre. Mais dans le troisième cas, la première paire d'accolades ne doit pas être échappée, mais la deuxième paire doit le faire. – miliu

Questions connexes