1

我有一个 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=&lt;enter new name&gt;}" />

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

谢谢你的帮助

4

0 回答 0