如何使用从wpf中的数据库中获取的值更改datagrid行背景颜色
Posted
技术标签:
【中文标题】如何使用从wpf中的数据库中获取的值更改datagrid行背景颜色【英文标题】:how to change datagrid row background color with value taken from database in wpf 【发布时间】:2015-04-25 17:30:00 【问题描述】:我想通过从数据库中获取值来更改数据网格行背景颜色。 我有 2 个值“错误”和“确定”。如果列字符串值为错误,则行颜色将为红色,如果确定,则必须为绿色。该值通过执行查询从数据库中获取。我在数据集中有这些值。我不清楚如何实现这一点?
我试过下面的代码:
<Window x:Class="stackDatagridColor.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:viewModels="clr-namespace:stackDatagridColor"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<viewModels:viewmodel x:Key="viewmodel"/>
<viewModels:BrushConverter x:Key="BrushConverter"/>
</Window.Resources>
<Grid>
<StackPanel>
<DataGrid ItemsSource="Binding Collection, Mode=TwoWay, Source=StaticResource viewmodel, UpdateSourceTrigger=PropertyChanged">
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Style.Triggers>
<DataTrigger Binding="Binding Status" Value="ERROR">
<Setter Property="Background" Value="Red"></Setter>
</DataTrigger>
<DataTrigger Binding="Binding Status" Value="OK">
<Setter Property="Background" Value="Green"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
</DataGrid>
</StackPanel>
</Grid>
视图模型:
public class viewmodel : INotifyPropertyChanged
private ObservableCollection<myItem> collection;
public ObservableCollection<myItem> Collection
get return collection;
set collection = value; OnPropertyChanged("Collection");
public viewmodel()
Collection = new ObservableCollection<myItem>();
myItem item1 = new myItem Name = "name1", Status = "OK" ;
myItem item2 = new myItem Name = "name2", Status = "ERROR" ;
DispatchService.Invoke(() =>
Collection.Add(item1);
Collection.Add(item2);
);
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged = delegate ;
protected void OnPropertyChanged(string propertyName)
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
#endregion
简单类
public class myItem
public string Status get; set;
public string Name get; set;
调度程序类
public static class DispatchService
public static void Invoke(Action action)
Dispatcher dispatchObject = Application.Current.Dispatcher;
if (dispatchObject == null || dispatchObject.CheckAccess())
action();
else
dispatchObject.Invoke(action);
转换器:
public class BrushConverter : IValueConverter
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
string input = value as string;
switch (input)
case "ERROR":
return Brushes.Red;
case "OK":
return Brushes.Green;
default:
return DependencyProperty.UnsetValue;
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
throw new NotSupportedException();
我只想绑定数据集列来触发。如果触发器获取 ERROR 字符串,则背景行颜色变为红色,反之亦然。
【问题讨论】:
您的代码似乎有效。我不确定我是否了解您的问题所在。 我不知道如何将数据集绑定到视图模型 数据集是 System.Data.DataSet 类的实例吗? 【参考方案1】:我得到了我的答案...没有新的此类东西..只是使用了 loadingrow 事件。这非常有用。 见下文
DataGridRow row = e.Row;
DataRowView rView = row.Item as DataRowView
if(rView != null && rView.Row.ItemArray[4].ToString().Contains("ERROR"))
e.row.Background= new SolidColorBrush(Color.Red);
else
e.row.Background= new SolidColorBrush(Color.Green);
【讨论】:
这里的“e”是什么? @ajivani 'LoadingRow' 是 DataGrid 的事件。如果我没记错的话,Dipika 正在编写上面的代码。【参考方案2】:首先Collection
属性应该这样声明:
public DataSet Collection ...
XAML 中的ItemSource
绑定也应该更改:
ItemsSource="Binding Path=Collection.Tables[Table1], Mode=OneWay,...
在上面的代码中,Table1 是您要绑定到的数据集中的表的名称。要测试此代码,请以这种方式创建一个简单的数据集:
public viewmodel()
var tb = new DataTable("Table1");
tb.Columns.Add("Status");
tb.Columns.Add("Name");
tb.Rows.Add("OK", "name1");
tb.Rows.Add("ERROR", "name2");
tb.Rows.Add("ERROR", "name3");
Collection2 = new DataSet();
Collection2.Tables.Add(tb);
【讨论】:
以上是关于如何使用从wpf中的数据库中获取的值更改datagrid行背景颜色的主要内容,如果未能解决你的问题,请参考以下文章
如何从 WPF 中的 app.config 获取 List<string> 值集合?