WPF datatemplate触发器可以分解吗?

时间:2018-09-19 12:50:16

标签: wpf xaml refactoring

你好,我有这个XAML代码

<DataTemplate x:Key="BLUnitPriceTemplate">
        <TextBlock x:Name="CellTB"
            Padding="10,3"
            Style="{StaticResource DarkSmallFontStyle}"
            Text="{Binding UnitPrice, StringFormat={}{0:N2}}" />
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding LineType}" Value="Total">
                <Setter Property="Background" Value="{StaticResource PinkBackgroundBrush}"
                    TargetName="CellTB" />
                <Setter Property="Style" Value="{StaticResource SmallFontStyle}"
                    TargetName="CellTB" />
            </DataTrigger>
            <DataTrigger Binding="{Binding LineType}" Value="Rate">
                <Setter Property="Background" Value="#CCCCCC"
                     TargetName="CellTB" />
            </DataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>
    <DataTemplate x:Key="BLRemiseTemplate">
        <TextBlock x:Name="CellTB"
           Padding="10,3"
           Style="{StaticResource DarkSmallFontStyle}"
           Text="{Binding Remise, StringFormat={}{0:N2}}" />
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding LineType}" Value="Total">
                <Setter Property="Background" Value="{StaticResource PinkBackgroundBrush}"
                    TargetName="CellTB" />
                <Setter Property="Style" Value="{StaticResource SmallFontStyle}"
                    TargetName="CellTB" />
            </DataTrigger>
            <DataTrigger Binding="{Binding LineType}" Value="Rate">
                <Setter Property="Background" Value="#CCCCCC"
                    TargetName="CellTB" />
            </DataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>

但是您可以看到数据模板触发器几乎相同。仅文本绑定更改。

我发现它显得过时又丑陋AF

有没有一种方法可以分解数据模板触发器以在多个DataTemplate中使用相同的触发器?

编辑: 答案是一个很好的尝试,但是由于Style定义中的Style Setter似乎没有用。如果有人阅读并想要尝试一下,我选择在工作时添加一些上下文。

此DataGrid使用了我的模板

 <DataGrid ItemsSource="{Binding Details}">
            <DataGrid.RowStyle>
                <Style TargetType="{x:Type DataGridRow}">
                    <Setter Property="Background" Value="LightGray"/>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=DataGridRow}}" Value="True">
                            <Setter Property="Background" Value="LightBlue"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.RowStyle>
            <DataGrid.Columns>
                <DataGridTemplateColumn
              CellStyle="{StaticResource AppManagementAddCellStyle}"
              Header="{x:Static languages:ResAbbreviations.PU}"
              Width="60"
              CellTemplate="{StaticResource BLUnitPriceTemplate}"
                            />
                <DataGridTemplateColumn
              CellStyle="{StaticResource AppManagementAddCellStyle}"
              Header="{x:Static languages:ResAbbreviations.DiscountPercent}"
              Width="60"
              CellTemplate="{StaticResource BLRemiseTemplate}"
                            />
            </DataGrid.Columns>
        </DataGrid>

1 个答案:

答案 0 :(得分:2)

将触发器移至TextBlock样式:

<Style x:Key="CellTBStyle" TargetType="TextBlock" 
       BasedOn="{StaticResource DarkSmallFontStyle}">
    <Setter Property="Padding" Value="10,3"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding LineType}" Value="Total">
            <Setter Property="Background" Value="{StaticResource PinkBackgroundBrush}"/>
            <!-- more Setters -->
        </DataTrigger>
        <DataTrigger Binding="{Binding LineType}" Value="Rate">
            <Setter Property="Background" Value="#CCCCCC"/>
        </DataTrigger>
    </Style.Triggers>
</Style>
<DataTemplate x:Key="BLUnitPriceTemplate">
    <TextBlock Style="{StaticResource CellTBStyle}"
               Text="{Binding UnitPrice, StringFormat={}{0:N2}}" />
</DataTemplate>
<DataTemplate x:Key="BLRemiseTemplate">
    <TextBlock Style="{StaticResource CellTBStyle}"
               Text="{Binding Remise, StringFormat={}{0:N2}}" />
</DataTemplate>