Формат строки ячейки WPF DataGrid в качестве стиля или шаблона

Я пробовал несколько способов выделить формат ячейки в WPF DataGrid (тот, который предоставляется с .NET 4):

  • преобразователь данных,
  • "StringFormat" свойство привязки в стиле
  • свойство привязки "StringFormat" в шаблоне данных.

Я опишу свои попытки, поскольку это может помочь кому-то другому, и я надеюсь, что кто-то может дать мне совет по улучшению этих решений. Обратите внимание, что я новичок в WPF ...

Ожидаемое поведение заключается в том, что строка ячейки отформатирована в определенном формате, например «1,234,567» для отображения, но при редактировании она должна быть отформатирована как «1234567» (форматирование по умолчанию) клетка. Когда я попытался использовать конвертер данных, я не нашел способа использовать форматирование по умолчанию при редактировании, поэтому я сосредоточил свою энергию на стилях и шаблонах.

В случае стиля определение DataGridTextColumn выглядит следующим образом:

<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>

Поведение в точности соответствует ожидаемому. Однако я не могу выделить этот стиль и использовать его несколько раз из-за привязки. Чтобы решить проблему факторинга, я использовал DataGridTemplateColumn и шаблоны данных. Вот мое определение DataGridTemplateColumn:

<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>

И определение ControlTemplate:

<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>

Использование шаблонов данных решает начальную проблему выделения форматирования ячеек DataGrid,но использование шаблона управления вызывает эргономические и визуальные проблемы. Например, навигация с двумя вкладками, вызванная шаблоном элемента управления (обсуждаемая во многих других местах), и внешний вид текстового поля редактирования (который я пытаюсь исправить с помощью толщины границы, заполнения и других настроек свойств).

Конкретные вопросы, связанные с этой проблемой:

  • Можно ли использовать преобразователь данных для форматирования строки для отображения и использовать форматирование по умолчанию для выпуска?
  • Можно ли исключить стиль DataGridTextColumn, сохранив при этом возможность указать источник привязки?
  • Есть ли способ использовать DataGridTemplateColumn, но просто сделать так, чтобы он выглядел как DataGridTextColumn?
8
задан Thibault 7 June 2011 в 08:24
поделиться