C # WPF - триггер данных для изменения цвета фона в элементе списка при условии

Я хочу изменить цвет фона элемента списка, когда строка в базе данных SQLite равна 1

Мой код выглядит так

public void getMailsFromDb()
    {
        string myConnString = "Data Source=db.s3db;Version=3;";
        string mySelectQuery = "SELECT * FROM `emails` ORDER BY `date` DESC, `time` DESC";
        SQLiteConnection sqConnection = new SQLiteConnection(myConnString);
        SQLiteCommand sqCommand = new SQLiteCommand(mySelectQuery, sqConnection);
        sqConnection.Open();
        try
        {
            SQLiteDataReader sqReader = sqCommand.ExecuteReader();
            while (sqReader.Read())
            {
                string from = sqReader.GetString(sqReader.GetOrdinal("sender"));
                string subject = sqReader.GetString(sqReader.GetOrdinal("subject"));
                string msgid = sqReader.GetString(sqReader.GetOrdinal("messageId"));            
                App.Current.Dispatcher.Invoke((Action)delegate
                {
                    ListBoxData.Add(new EmailEntry { from = from, subject = subject, messageID = msgid });
                    // HERE IS THE PLACE WHERE I WANT TO CHANGE THE BG COLOUR OF THE LISTBOX ITEM
                });
            }
            sqReader.Close();
        }
        catch
        {
            MessageBox.Show("Problems reading mails from database!", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
        }
        finally
        {
            sqConnection.Close();
        }

Я считаю, что следует использовать триггер данных. Однако я не уверен, как это использовать. Я новичок в WPF. Но это мой XAML ListBox

<ListBox Name="EmailList" ItemsSource="{Binding ListBoxData, Mode=TwoWay}" HorizontalContentAlignment="Stretch" Margin="10" SelectionChanged="EmailEntry_SelectionChanged">
                       <ListBox.ItemContainerStyle>
                        <Style TargetType="{x:Type ListBoxItem}">
                            <Setter Property="FocusVisualStyle" Value="{x:Null}" />
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="ListBoxItem">
                                        <Border BorderBrush="#000000" BorderThickness="0 0 0 1" Name="Border" Margin="0" Padding="0" SnapsToDevicePixels="true">
                                            <ContentPresenter />
                                        </Border>
                                        <ControlTemplate.Triggers>
                                            <Trigger Property="IsSelected" Value="true">
                                                <Setter TargetName="Border" Property="Background" Value="#dcdcdc" />
                                            </Trigger>
                                            <Trigger Property="IsMouseOver" Value="true">
                                                <Setter TargetName="Border" Property="Background" Value="#f0f0f0"></Setter>                         
                                            </Trigger>
                                        </ControlTemplate.Triggers>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </ListBox.ItemContainerStyle>

                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel HorizontalAlignment="Stretch" Tag="{Binding messageID}">
                                <TextBlock Name="fromTxt" Text="{Binding from}" HorizontalAlignment="Stretch"/>
                                <TextBlock Name="subjectTxt" Text="{Binding subject}" HorizontalAlignment="Stretch"/>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

У меня работают обычные триггеры, для наведения мыши и так далее. Но я запутался в части триггера данных, когда ее следует использовать в коде, который, как я полагаю, вызван. Кто-нибудь может помочь?


person Daniel Jørgensen    schedule 04.06.2014    source источник
comment
Если ваш класс EmailEntry поддерживает привязку, вы можете привязать член к триггеру данных. Вы можете показать декларацию для EmailEntry? Он должен быть понятным, если он дружественен к привязке .......   -  person Gayot Fow    schedule 05.06.2014


Ответы (1)


Вместо этого вы можете использовать IValueConverter.

см. приведенный ниже код, в котором я привязываю List к ListBox. И я хочу, чтобы мой ListBoxItem имел светло-зеленый фон для нечетных чисел и голубой для четных.

public partial class MainWindow : Window
    {
        public List<int> ListBoxData { get; set; }

        public MainWindow()
        {
            InitializeComponent();

            ListBoxData = new List<int>() { 1, 2, 3, 4, 5, 6 };
            DataContext = this;
        }
    }

    public class NumberToColorConverter : IValueConverter
    {

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            int number = (int)value;
            if (number % 2 == 0)
            {
                return Brushes.LightBlue;
            }
            return Brushes.LightGreen;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }


<Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication3"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ListBox ItemsSource="{Binding ListBoxData}">
            <ListBox.Resources>
                <local:NumberToColorConverter x:Key="NumberToColorConverter"/>
                <Style TargetType="ListBoxItem">
                    <Setter Property="Background" Value="{Binding Converter={StaticResource NumberToColorConverter}}"/>
                </Style>
            </ListBox.Resources>
        </ListBox>
    </Grid>
</Window>

Как вы упомянули, вы новичок в WPF, эта ссылка может помочь вам разобраться в преобразователях ценности.

person krishnaaditya    schedule 04.06.2014