1

同じフォーマットを必要とする数値データを表示する 10 個の DataGridTextColumns を持つ WPF DataGrid があります。EditingElementStyle の数値の書式設定 (生の 10 進数または浮動小数) を 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