Nano Hash - криптовалюты, майнинг, программирование

Привязка фона элемента ListBox и цвета выбора в WPF

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

В идеале конечный результат (в зависимости от состояния выбора) должен иметь оттенок зеленого, если логическое значение контекста данных истинно, или оттенок красного, если оно ложно.

MainWindow.xaml:

<ListBox x:Name="CrewList" ItemsSource="{Binding CrewList}" SelectedItem="{Binding SelectedCrew}" Style="{StaticResource EventOverviewListBox}" Grid.Column="1" Grid.Row="0">
            <ListBox.ItemContainerStyle>
                <Style TargetType="{x:Type ListBoxItem}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Data.IsValid}" Value="true">
                            <Setter Property="Background" Value="{StaticResource StatusValid}"/>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Data.IsValid}" Value="false">
                            <Setter Property="Background" Value="{StaticResource StatusInvalid}"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ListBox.ItemContainerStyle>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" Margin="10,10,10,10" KeyboardNavigation.IsTabStop="False">
                        <TextBlock Text="{Binding Lane}" Margin="0,0,20,0" FontSize="20" />
                        <TextBlock Text="{Binding ClubName}" Foreground="Black" VerticalAlignment="Center"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

App.xaml:

    <SolidColorBrush x:Key="StatusValid">LawnGreen</SolidColorBrush>
    <SolidColorBrush x:Key="StatusInvalid">Red</SolidColorBrush>
    <Style x:Key="EventOverviewListBox" TargetType="ListBox">
        <Setter Property="KeyboardNavigation.IsTabStop" Value="False"/>
        <Setter Property="HorizontalAlignment" Value="Stretch"/>
        <Setter Property="VerticalAlignment" Value="Stretch"/>
        <Setter Property="Background" Value="Teal"/>
    </Style>
    <Style x:Key="EventOverviewListBoxItem" TargetType="ListBoxItem">
        <Setter Property="KeyboardNavigation.IsTabStop" Value="False"/>
    </Style>

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

Спасибо!


  • Что вы имеете в виду под состоянием выбора? Если я правильно понимаю, если элемент не выбран, фон должен быть по умолчанию, но если элемент выбран, то либо StatusValid, либо StatusInvalid. Я прав? 14.08.2016

Ответы:


1

Я предполагаю, что под «состоянием выбора» вы подразумеваете, выбран элемент или нет.

ListBoxItem имеет ControlTemplate с триггерами, который имеет приоритет над триггерами. Вам необходимо создать свой собственный ControlTemplate для стиля ListBoxItem. Также используйте MultiDataTrigger.

Нравится:

<Style TargetType="{x:Type ListBoxItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListBoxItem">
                <Border Name="BorderWrap">
                    <ContentPresenter />
                </Border>
                <ControlTemplate.Triggers>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding RelativeSource={RelativeSource Self},Path=IsSelected}" Value="True" />
                            <Condition Binding="{Binding Data.IsValid}" Value="True" />
                        </MultiDataTrigger.Conditions>
                        <MultiDataTrigger.Setters>
                            <Setter TargetName="BorderWrap" Property="Background" Value="{StaticResource StatusValid}"/>
                        </MultiDataTrigger.Setters>
                    </MultiDataTrigger>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding RelativeSource={RelativeSource Self},Path=IsSelected}" Value="True" />
                            <Condition Binding="{Binding Data.IsValid}" Value="False" />
                        </MultiDataTrigger.Conditions>
                        <MultiDataTrigger.Setters>
                            <Setter TargetName="BorderWrap" Property="Background" Value="{StaticResource StatusInvalid}"/>
                        <MultiDataTrigger.Setters>
                    </MultiDataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
14.08.2016
  • Да спасибо! MultiDataTrigger работал красиво. Мне просто нужно было обернуть Условия и Установщики в <MultiDataTrigger.Conditions> и <MultiDataTrigger.Setters> соответственно. 18.08.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..