我有一个 WPF DataGrid,它有 10 个 DataGridTextColumns 显示需要相同格式的数字数据。我希望 EditingElementStyle 数字格式(原始十进制或浮点数)与 ElementStyle 格式(格式化百分比或货币)不同。如果重要的话,我的网格的 DataContext 是一个 CollectionViewSource。
如果可能,我想提出一个可重用的样式或模板资源来定义我的列。我的 10 个 DataGridTextColumns 的 XAML 几乎相同。我不太清楚如何在我的模板中使用 TemplateBinding、Element 绑定或 RelativeSource 绑定,以确保在解析模板后每列都获得正确的绑定。
我的最终目标是能够如下定义我的 DataGridTextColumns:
<DataGridTextColumn x:Name="dingCutoffPctColumn"
Binding="{Binding CutoffPct}" Header="Cutoff %" Width="60"
ElementStyle="{StaticResource NumberElementStyle}"
EditingElementStyle="{StaticResource EditErrorStyle}" />
这是我当前正在使用的工作 XAML 的表示:
<DataGrid x:Name="myDataGrid" AutoGenerateColumns="False"
Margin="10,67,13,0" Height="200" EnableRowVirtualization="True"
ItemsSource="{Binding}" VerticalAlignment="Top">
<DataGrid.Resources>
<Style x:Key="EditErrorStyle" TargetType="{x:Type TextBox}">
<Setter Property="Padding" Value="-2"/>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="Background" Value="Red"/>
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
<Style x:Key="NumberElementStyle" TargetType="{x:Type TextBlock}">
<Setter Property="TextAlignment" Value="Right"/>
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn x:Name="id" Binding="{Binding ID}"
Visibility="Collapsed" />
<DataGridTextColumn x:Name="name" Header="Name"
Binding="{Binding Name,
TargetNullValue=<enter new name>}" />
<DataGridTextColumn x:Name="cutoffPct" {Binding CutoffPct}"
Header="Cutoff %" Width="60">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}"
BasedOn="{StaticResource NumberElementStyle}">
<Setter Property="Text"
Value="{Binding CutoffPct, StringFormat=P}"/>
</Style>
</DataGridTextColumn.ElementStyle>
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="{x:Type TextBox}"
BasedOn="{StaticResource EditErrorStyle}">
<Setter Property="Text"
Value="{Binding CutoffPct,
ValidatesOnExceptions=True, StringFormat=\{0\}}"/>
</Style>
</DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
谢谢你的帮助