我有一个WPF DataGrid,它有10个DataGridTextColumns,显示需要相同格式的数字数据。我希望EditingElementStyle数字格式(原始小数或浮点数)与ElementStyle格式(格式化百分比或金钱)不同。如果重要,我的网格的DataContext是一个CollectionViewSource。
如果可能的话,我想提供一个reusabe样式或模板资源来定义我的列。我的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>
感谢您的帮助