Почему триггеры стиля не работают с шаблонными столбцами в GridView? - PullRequest
1 голос
/ 17 февраля 2012

У меня есть ListView для отображения событий журнала. Триггер стиля определен для изменения цвета строки в зависимости от серьезности журнала. Работает нормально, за исключением одного столбца, который использует CellTemplate. Предметы Label сохраняют там нормальный цвет.

<ListView x:Name="LogEvents" Grid.Row="0" FontSize="9">
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Setter Property="Background" Value="White"/>
            <Setter Property="Foreground" Value="Black"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Level.DisplayName}" Value="ERROR">
                    <Setter Property="Background" Value="LightSalmon"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding Level.DisplayName}" Value="INFO">
                    <Setter Property="Background" Value="LightGreen"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding Level.DisplayName}" Value="DEBUG">
                    <Setter Property="Background" Value="White"/>
                    <Setter Property="Foreground" Value="Gray"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding Level.DisplayName}" Value="WARN">
                    <Setter Property="Background" Value="LightYellow"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding Level.DisplayName}" Value="FATAL">
                    <Setter Property="Background" Value="Red"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.View>
        <GridView x:Name="GridView1">
            <GridViewColumn Header="TimeStamp" DisplayMemberBinding="{Binding TimeStamp, ConverterCulture=de-DE, StringFormat=HH:mm:ss.fff}"/>
            <GridViewColumn  DisplayMemberBinding="{Binding Level}" Header="Level" />
            <GridViewColumn Header="Thread" DisplayMemberBinding="{Binding ThreadName}"  />
            <GridViewColumn Header="Message" DisplayMemberBinding="{Binding RenderedMessage}"  />
            <!--<GridViewColumn Header="UserName" DisplayMemberBinding="{Binding UserName}"  />-->
            <GridViewColumn Header="Class.Method">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Label Content="{Binding Path=LocationInformation.ClassName}" Padding="0"/>
                            <Label Content="." Padding="0"/>
                            <Label Content="{Binding Path=LocationInformation.MethodName}" Padding="0"/>
                            <Label Content="(" Padding="0"/>
                            <Label Content="{Binding Path=LocationInformation.LineNumber}" Padding="0"/>
                            <Label Content=")" Padding="0"/>
                        </StackPanel>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

Например, если Level = Debug, столбец Class.Method получает соответствующий фон (LightGrey), но Forground остается черным (по умолчанию).

Что мне здесь делать? Повторите Style.Triggers для меток x: Type?

1 Ответ

0 голосов
/ 17 февраля 2012

Это сработало. Не уверен, что есть более хороший способ, но он довольно компактен.

<GridViewColumn.CellTemplate>
     <DataTemplate>
        <!-- Added this section so Label inherits from Parent ListViewItem -->
        <DataTemplate.Resources>
            <Style TargetType="{x:Type Label}">
                <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}, Path=Background}"/>
                <Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}, Path=Foreground}"/>
            </Style>
        </DataTemplate.Resources>
        <StackPanel Orientation="Horizontal">
           <Label  ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...