为 DataGrid 中的 DataRow 用 UserControl.Style 补充 Application.Resources.Style

Complementing Application.Resources.Style with UserControl.Style for DataRow in DataGrid

我有一个 global 样式用于所有应用程序 DataGrid,在 Application.Resources:

中定义
<Application.Resources>
    <ResourceDictionary>
        <Style x:Key="StyleDataGridRow" TargetType="{x:Type DataGridRow}">
            <Setter Property="VerticalAlignment" Value="Center" />
            <Style.Triggers>
                <Trigger Property="DataGrid.IsSelected" Value="True">
                    <Setter Property="DataGrid.BorderBrush" Value="{DynamicResource SecondaryHueMidBrush}" />
                    <Setter Property="DataGrid.BorderThickness" Value="1" />
                    <Setter Property="Background" Value="{DynamicResource PrimaryHueLightBrush}" />
                </Trigger>
                <Trigger Property="DataGrid.IsSelected" Value="False">
                    <Setter Property="DataGrid.BorderBrush" Value="{DynamicResource SecondaryHueMidBrush}" />
                    <Setter Property="DataGrid.BorderThickness" Value="1" />
                </Trigger>
            </Style.Triggers>
        </Style>
</Application:Resources>

在我的 UserControl 中,我想添加一种样式 - 保持全局样式 - 以根据此 DataGrid 中使用的项目突出显示一行。我可以在 UserControl 的资源中定义此样式:

    <UserControl.Resources>
        <ResourceDictionary>            
            <Style x:Key="priceMissing" TargetType="{x:Type DataGridRow}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=priceIsMissing}" Value="true">
                        <Setter Property="Background" Value="LightSalmon" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ResourceDictionary>
    </UserControl.Resources>

全局 样式应用到 UserControlDataGrid,如下所示:

<DataGrid x:Name="dgCalculatedServices"
    Margin="20,0,0,0"
    CellStyle="{StaticResource StyleDataGridCell}"
    DataContext="{Binding}"
    ItemsSource="{Binding calculationServiceCodes.collection}"                              
    Style="{StaticResource StyleDataGrid}"
    RowStyle="{StaticResource StyleDataGridRow}">

有人知道在 DataGrid 上使用 global 样式并用 local 样式补充它的方法吗?

这就是 BasedOn 属性 的用途。

Styles can be based on other styles through this property. When you use this property, the new style will inherit the values of the original style that are not explicitly redefined in the new style.

StyleDataGridRow 样式指定为 priceMissing 的基本样式。

<UserControl.Resources>
    <ResourceDictionary>            
        <Style x:Key="priceMissing" TargetType="{x:Type DataGridRow}" BasedOn="{StaticResource StyleDataGridRow}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=priceIsMissing}" Value="true">
                    <Setter Property="Background" Value="LightSalmon" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ResourceDictionary>
</UserControl.Resources>

然后在 DataGrid 中使用 priceMissing 样式。

<DataGrid x:Name="dgCalculatedServices
    ...
    RowStyle="{StaticResource priceMissing}">

您当然可以将 priceMissing 样式重命名为 StyleDataGridRow。然后样式将在 UserControl.

的范围内被覆盖