WPF - проблема с триггерами

У меня есть два ListView с триггером, которые при выборе меняют цвет фона на темно-серый, а цвет переднего плана на белый. Проблема в том, что когда я выбираю элемент в первом представлении списка, а затем элемент во втором представлении списка, элемент на переднем плане первого представления списка не становится снова черным и остается белым.

alt text

xaml:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="190*" />
        <RowDefinition Height="121*" />
    </Grid.RowDefinitions>
    <Grid.Resources>
        <ResourceDictionary>
            <Style x:Key="@ListViewItemStyle" TargetType="{x:Type ListViewItem}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType='{x:Type ListViewItem}'>
                            <Grid SnapsToDevicePixels="True" Margin="0">
                                <Border x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}" />
                                <GridViewRowPresenter x:Name="Content" TextBlock.Foreground="{TemplateBinding Foreground}"
                        Content="{TemplateBinding Content}" Columns="{TemplateBinding GridView.ColumnCollection}" />
                            </Grid>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsSelected" Value="true">
                                    <Setter Property="TextElement.Foreground" Value="White" TargetName="Content" />
                                    <Setter Property="Background" Value="DarkGray" TargetName="Bd"/>
                                </Trigger>
                                <MultiTrigger>
                                    <MultiTrigger.Conditions>
                                        <Condition Property="IsSelected" Value="true" />
                                        <Condition Property="Selector.IsSelectionActive" Value="false" />
                                    </MultiTrigger.Conditions>
                                    <Setter Property="Background" TargetName="Bd"
                            Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
                                    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" />
                                </MultiTrigger>
                                <Trigger Property="IsEnabled" Value="false">
                                    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

            <DataTemplate x:Key="@TextCellTemplate">
                <TextBlock Text="{Binding Name}"/>
            </DataTemplate>

            <DataTemplate x:Key="@TrubleCellTemplate">
                <Rectangle Width="20" Height="20" Fill="Black"></Rectangle>
            </DataTemplate>

        </ResourceDictionary>
    </Grid.Resources>


    <ListView ItemsSource="{Binding Persons}" Style="{DynamicResource @ListView}" ItemContainerStyle="{DynamicResource @ListViewItemStyle}">
        <ListView.View>
            <GridView>
                <GridViewColumn Width="40" CellTemplate="{DynamicResource @TextCellTemplate}" />
                <GridViewColumn Width="131" CellTemplate="{DynamicResource @TrubleCellTemplate}" />
            </GridView>
        </ListView.View>
    </ListView>

    <ListView ItemsSource="{Binding Persons}" Style="{DynamicResource @ListView}" ItemContainerStyle="{DynamicResource @ListViewItemStyle}" Grid.Row="1">
        <ListView.View>
            <GridView>
                <GridViewColumn Width="40" CellTemplate="{DynamicResource @TextCellTemplate}" />
                <GridViewColumn Width="131" CellTemplate="{DynamicResource @TrubleCellTemplate}" />
            </GridView>
        </ListView.View>
    </ListView>

</Grid>

person Erez    schedule 02.12.2010    source источник
comment
Просто догадка ... посмотрите, решит ли вашу проблему добавление x:Shared="false" к определению стиля (элементу) в ResourceDictionary.   -  person Gishu    schedule 02.12.2010
comment
@Gishu - спасибо, но не сработало   -  person Erez    schedule 02.12.2010
comment
@Erez - Хорошо. попробуйте добавить обратный триггер, т.е. когда IsSelected = False, или укажите состояние по умолчанию в самом стиле. Триггеры могут очень раздражать, когда они не работают - недавно я столкнулся с одной - прочтите это и посмотрите, есть ли у вас какие-нибудь потенциальные клиенты geekswithblogs.net/thibbard/archive/2008/05/13/   -  person Gishu    schedule 02.12.2010
comment
Может быть, потому что этот элемент в первом ListView все еще выбран? Мне не ясно, хотите ли вы вернуться к исходному стилю, когда элемент больше не выбран или просто когда элемент теряет фокус (в этом случае вы можете заменить IsSelected на IsFocused) ... также просто догадка.   -  person Andrei Pana    schedule 02.12.2010
comment
@Andrei Pana - Спасибо !!! это сработало.   -  person Erez    schedule 02.12.2010
comment
@ Андрей - хороший улов. пропустил :)   -  person Gishu    schedule 02.12.2010


Ответы (1)


Вы сталкиваетесь с помехами между двумя триггерами в шаблоне. Первый триггер IsSelected становится активным, когда вы впервые выбираете значение в ListView # 1. Это переопределяет значение TextBlock.Foreground в «Content» из TemplateBinding на фиксированное значение White.

Когда ListView # 1 теряет фокус на ListView # 2, также активируется второй триггер (MultiTrigger для IsSelected и IsSelectionActive). Это приводит к тому, что Фон «Bd» устанавливается на другое значение (такое же, как и у другого триггера), и, поскольку он объявлен позже в коллекции триггеров, переопределяет предыдущий триггер, который все еще активен.

То же самое должно произойти с установщиком Foreground, но тот, что в MultiTrigger, устанавливает Foreground на родительский элемент управления, а не на «Content». Поскольку «Content» больше не использует TemplateBinding для извлечения значения Foreground родительского элемента управления, значение White первого триггера остается активным для элемента «Content».

person John Bowen    schedule 02.12.2010