Возможен ли факторизационный триггер WPF для таблицы данных? - PullRequest
0 голосов
/ 19 сентября 2018

Здравствуйте, у меня есть этот код 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?

РедактироватьОтвет был удачным, но, похоже, не сработал из-за установки стиля в определении стиля.Я решил добавить некоторый контекст, пока работаю с ним, если кто-то прочитал это и хочет попробовать.

Мои шаблоны используются этой сеткой данных

 <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 голосов
/ 19 сентября 2018

Переместите триггеры в стиль 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...