带有绑定的WPF DataGridTextColumn ElementStyle和EditElementStyle的模板

时间:2013-01-15 16:56:19

标签: wpf data-binding .net-4.0 datatemplate datagridtextcolumn

我有一个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=&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>

感谢您的帮助

0 个答案:

没有答案