ItemContainer списка просмотра Datatrigger не работает, когда указатель мыши находится над (или выбран) конкретным элементом - PullRequest
0 голосов
/ 26 марта 2019

В ListView я связываю с условием DataTrigger цвет фона элемента (текстового блока) со свойством Integer, потому что, когда свойство изменяется (от 0 до 1), я хочу, чтобы фон этого элемента становился прозрачным и красным.

Этот триггер не работает в двух случаях: когда мышь находится над элементом или когда этот конкретный элемент выбран. В этих двух случаях фон всегда прозрачен, несмотря на значение свойства.

Таким образом, элемент меняет свой фон, только если указатель мыши находится над другими элементами или выбран другие элементы.

Текстовый блок определен в отдельном DataTemplate (он является частью BoardViewModel), а ListView является коллекцией этих ВМ. В своем коде я проверил, что в описании текстового блока нет условия активного триггера "isMouseOver" и что в разделе списка нет активного триггера "isSelected". Я также пытался удалить фон структур, но это не имеет никакого отношения к проблеме.

- DataTemplate ---

    <DataTemplate DataType="{x:Type viewModels:BoardViewModel}">
        <Grid >

            <Grid HorizontalAlignment="Stretch"  Grid.Row="0" Width="Auto" Height="Auto">
                <Border Margin="20,20,20,20" BorderThickness="2" BorderBrush="Transparent" HorizontalAlignment="Stretch">
                    <TextBlock HorizontalAlignment="Stretch">
                        <TextBlock.Text>
                            <MultiBinding StringFormat="ID: {0}">
                                <Binding Path="ID"/>
                            </MultiBinding>
                        </TextBlock.Text>
        </TextBlock>
                </Border>
            </Grid>

        </Grid>
    </DataTemplate>

--- Вид ---

        <Grid Grid.Row="0">
            <ListView Height="Auto" Background="{StaticResource BoardBackground}" ItemsSource="{Binding Path= BoardViewModels}" SelectedItem="{Binding CurrentBoardViewModel}" IsSynchronizedWithCurrentItem="true">
                <ListView.ItemContainerStyle>
                    <Style TargetType="{x:Type ListViewItem}">

                        <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path= ErrorRedFlagByBoard}" Value="1">
                                <Setter Property="Background" Value="Red"></Setter>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding Path= ErrorRedFlagByBoard}" Value="0">
                                <Setter Property="Background" Value="Transparent"></Setter>
                            </DataTrigger>

                        </Style.Triggers>
                    </Style>
                </ListView.ItemContainerStyle>
            </ListView>
        </Grid>

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

1 Ответ

1 голос
/ 26 марта 2019

Попробуйте определить пользовательский ControlTemplate для ListViewItem и добавьте триггер к <ControlTemplate.Triggers>:

<Style TargetType="{x:Type ListViewItem}">
    <Style.Resources>
        <SolidColorBrush x:Key="Item.MouseOver.Background" Color="#1F26A0DA"/>
        <SolidColorBrush x:Key="Item.MouseOver.Border" Color="#a826A0Da"/>
        <SolidColorBrush x:Key="Item.SelectedInactive.Background" Color="#3DDADADA"/>
        <SolidColorBrush x:Key="Item.SelectedInactive.Border" Color="#FFDADADA"/>
        <SolidColorBrush x:Key="Item.SelectedActive.Background" Color="#3D26A0DA"/>
        <SolidColorBrush x:Key="Item.SelectedActive.Border" Color="#FF26A0DA"/>
    </Style.Resources>
    <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListViewItem}">
                <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                </Border>
                <ControlTemplate.Triggers>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsMouseOver" Value="True"/>
                        </MultiTrigger.Conditions>
                        <Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.MouseOver.Background}"/>
                        <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.MouseOver.Border}"/>
                    </MultiTrigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="Selector.IsSelectionActive" Value="False"/>
                            <Condition Property="IsSelected" Value="True"/>
                        </MultiTrigger.Conditions>
                        <Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.SelectedInactive.Background}"/>
                        <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.SelectedInactive.Border}"/>
                    </MultiTrigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="Selector.IsSelectionActive" Value="True"/>
                            <Condition Property="IsSelected" Value="True"/>
                        </MultiTrigger.Conditions>
                        <Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.SelectedActive.Background}"/>
                        <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.SelectedActive.Border}"/>
                    </MultiTrigger>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter Property="TextElement.Foreground" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                    </Trigger>
                    <DataTrigger Binding="{Binding Path= ErrorRedFlagByBoard}" Value="1">
                        <Setter Property="Background" TargetName="Bd" Value="Red"></Setter>
                    </DataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Триггеры в шаблоне по умолчанию имеют приоритет над вашими триггерами.

...