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?
Avez-vous essayé d'obtenir et d'utiliser le "par défaut" modèle de DataGridTextColumn et en changeant uniquement les éléments dont vous avez besoin? Vous avez probablement besoin de tous les déclencheurs intégrés dans le modèle par défaut.
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