C#WPF-数据触发器在条件下更改listboxitem中的背景色
当SQLite DB中的一行为1时,我想更改listboxitem的背景色 我的代码如下所示C#WPF-数据触发器在条件下更改listboxitem中的背景色,c#,wpf,datatrigger,listboxitem,C#,Wpf,Datatrigger,Listboxitem,当SQLite DB中的一行为1时,我想更改listboxitem的背景色 我的代码如下所示 public void getMailsFromDb() { string myConnString = "Data Source=db.s3db;Version=3;"; string mySelectQuery = "SELECT * FROM `emails` ORDER BY `date` DESC, `time` DESC"; SQLit
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 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>
我让正常的触发器工作,比如鼠标套等等。但是我对数据触发部分感到困惑,我相信它应该在代码中使用。有人可以帮忙吗?相反,您可以使用IValueConverter 请参阅下面的代码,我正在将列表绑定到列表框。我希望我的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>
公共部分类主窗口:窗口
{
公共列表ListBoxData{get;set;}
公共主窗口()
{
初始化组件();
ListBoxData=new List(){1,2,3,4,5,6};
DataContext=this;
}
}
公共类编号颜色转换器:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
整数=(整数)值;
如果(数字%2==0)
{
返回笔刷。浅蓝色;
}
返回笔刷。浅绿色;
}
公共对象转换回(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}
正如您所提到的,您是WPF新手,这可能有助于您了解值转换器如果您的EmailEntry类是绑定友好的,则可以将成员绑定到数据触发器。你能出示电子邮件输入的声明吗?它应该是直接的,如果它是友好的。。。。。。。