Я пробовал несколько способов выделить формат ячейки в WPF DataGrid (тот, который поставляется с .NET 4):
- преобразователь данных,
- the "Свойство привязки 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?