WPF DataGrid cellule de format de chaîne de caractères comme un style ou un modèle
J'ai essayé plusieurs façons de factoriser le format d'une cellule dans un WPF DataGrid (celui fourni avec .NET 4):
- un convertisseur de données,
- la "StringFormat" propriété de liaison à l'intérieur d'un style,
- la "StringFormat" propriété de liaison à l'intérieur d'un modèle de données.
Je vais décrire ma tente comme il peut aider quelqu'un d'autre, et j'espère que quelqu'un peut me donner des conseils pour améliorer ces solutions. Notez que je suis assez nouveau à WPF...
Le comportement attendu est que la cellule de chaîne est mise en forme à quelque chose de spécifique comme "1,234,567" pour l'affichage, mais il doit être au format "1234567" (de sa mise en forme par défaut) lors de la modification de la cellule. Quand j'ai essayé d'utiliser un convertisseur de données, je n'ai pas trouvé une façon d'utiliser la mise en forme par défaut lors de l'édition, donc je concentre mon énergie sur des styles et des modèles.
Avec un style, la définition de la DataGridTextColumn va comme ceci:
<DataGridTextColumn Header="Price (Style)" SortMemberPath="BILL_PRICE">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Text" Value="{Binding Path=BILL_PRICE, StringFormat={}{0:N0}}"/>
</Style>
</DataGridTextColumn.ElementStyle>
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Text" Value="{Binding Path=BILL_PRICE}"/>
<Setter Property="Padding" Value="0"/>
<Setter Property="BorderThickness" Value="0"/>
</Style>
</DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>
Le comportement est exactement ce qui est attendu. Cependant, je ne peux pas le facteur de ce style et de l'utiliser plusieurs fois, en raison de la liaison. Pour résoudre l'affacturage problème, j'ai utilisé un DataGridTemplateColumn et des modèles de données. Voici mon DataGridTemplateColumn définition:
<DataGridTemplateColumn Header="Price (Template)" SortMemberPath="BILL_PRICE">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentControl Content="{Binding BILL_PRICE}" Template="{StaticResource CurrencyCellControlTemplate}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ContentControl Content="{Binding BILL_PRICE, Mode=TwoWay}" Template="{StaticResource CurrencyCellEditingControlTemplate}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
Et la ControlTemplate définition:
<ControlTemplate x:Key="CurrencyCellControlTemplate" TargetType="ContentControl">
<TextBlock Margin="2,0,2,0" Padding="0" TextAlignment="Right">
<TextBlock.Text>
<Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Content" StringFormat="{}{0:N0}"/>
</TextBlock.Text>
</TextBlock>
</ControlTemplate>
<ControlTemplate x:Key="CurrencyCellEditingControlTemplate" TargetType="ContentControl">
<TextBox Padding="0" BorderThickness="0" TextAlignment="Right">
<TextBox.Text>
<Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Content"/>
</TextBox.Text>
</TextBox>
</ControlTemplate>
À l'aide de modèles de données permet de résoudre le problème initial de la factorisant un DataGrid mise en forme de cellule, mais à l'aide d'un modèle de contrôle apporte ergonomique et des problèmes visuels. Par exemple, le double-onglet de navigation causée par le modèle de contrôle (discuté dans de nombreux autres endroits), et le look de la modification de la zone de texte (que j'ai essayer de les corriger avec l'épaisseur de la bordure, remplissage et les autres paramètres de la propriété.)
Questions spécifiques relatives à cette question sont :
- Peut un convertisseur de données sera utilisée pour le format de la chaîne de caractères pour l'affichage et l'utilisation de la mise en forme par défaut pour l'édition?
- Est-il possible de factoriser la DataGridTextColumn style tout en étant capable de spécifier la source de liaison?
- Est-il un moyen d'utiliser un DataGridTemplateColumn mais simplement de faire paraître et se sentir comme un DataGridTextColumn?
Je ne suis pas sûr pour l'approche de la ce. Est le modèle par défaut matérialisé comme certains XAML? J'ai essayé les outils qui montrent pratiquement modèles par défaut (affiché comme XAML lors de la sélection d'un thème et d'un contrôle spécifique), mais il n'y avait rien pour DataGridTextColumn. Ou tu veux dire que je devrais obtenir le modèle par défaut dans le code derrière et appliquer de manière dynamique pour les colonnes?
OriginalL'auteur Thibault | 2011-06-07
Vous devez vous connecter pour publier un commentaire.
Faire votre propre personnalisé DataGridTextColumn et crée des liaisons à attribuer à l'Élément et le EditingElement (l'un d'eux avec un convertisseur de l'un d'eux sans).
Le convertisseur de formats de la chaîne de ressembler à une décimale avec les virgules.
Je ne comprends pas comment la chaîne de mise en forme que vous avez posté travaille donc j'ai fait simple, si vous voulez plus de décimales juste faire le tri dans le convertisseur.
Tout ce que vous devez faire maintenant est de placer une référence à l'espace de noms dans votre xaml et puis créer une colonne dans la grille de données.
Alors tout doit être bien
u_u
Ridge au sérieux? Pour formater le contenu dans les cellules d'une colonne de cette solution est incroyablement complexe.
OriginalL'auteur Jason Ridge