最近要用wpf寫程序,要改變datagrid的單元格顏色,根據條件改變顏色
廢話不多說了,直接代碼吧,都是很簡單的代碼。
準備工作:添加一個顏色的值轉換器。我這裏寫在window的資源文件了,只這個窗口使用。可以根據實際情況添加。(這個之前代碼裏面有,博客裏寫掉了,感謝 xhh325的提問)
<Window.Resources>
<local:ColorConvert x:Key="ColorConvert"/>
</Window.Resources>
首先,datagrid控件設置好,主要是數據綁定,和值轉換
<my:DataGrid AutoGenerateColumns="False" Margin="10,10,10,10" Name="dataGrid" >
<my:DataGrid.CellStyle >
<Style TargetType="my:DataGridCell">
<Style.Triggers >
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="White"></Setter>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="BorderThickness" Value="0"></Setter>
</Trigger>
<Trigger Property="IsSelected" Value="False">
<Setter Property="Background" Value="White"></Setter>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="BorderThickness" Value="0"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</my:DataGrid.CellStyle>
<my:DataGrid.Columns>
<my:DataGridTemplateColumn Header="xxx" >
<my:DataGridTemplateColumn.CellTemplate>
<DataTemplate >
<TextBlock Text="{Binding xxx}" Background="{Binding Path=xxx,Converter={StaticResource colorConvert}}" Foreground="Black" />
</DataTemplate>
</my:DataGridTemplateColumn.CellTemplate>
</my:DataGridTemplateColumn>
</my:DataGrid.Columns>
</my:DataGrid>
然後,根據條件寫好值轉換器就行了
namespace xxx
{
//定義值轉換器
[ValueConversion(typeof(string), typeof(string))]
public class ColorConvert : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string strValue = value.ToString();
if (strValue == "紅色警報")
{
return "Red";
}
return "White";
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return "";
}
}
}
總結一下,主要注意3點:
1、根據條件定義一個值轉換顏色的類
2、在xaml利用定義值轉換類的靜態資源,方面後面使用
3、綁定數據
之前,我很多博客都是直接代碼,沒有很多文章描述,也沒有完整例子,因爲我通常只看關鍵技術點,然後能把這些東西拼湊成我想要的(這些博客主要是想對自己以後的方便吧)。
今天看到xhh325留言說有異常,至於什麼原因引起的,我不知道他的代碼,也不清楚什麼原因。於是,總結了上面3個關鍵點吧,並寫了個簡單的小例子(http://download.csdn.net/source/3461165),以供參考。
在我剛編輯完博客不久,xhh325又提出的新的要求:DataGrid需要動態綁定一個DataTable數據源,而且DataTabel的列是不確定的,需要根據最後一列的內容判定顏色,”完成“顯示綠色,其它顯示紅色
其實,主要是把xaml寫的代碼,換成c#的,如下:
// 初始化dataGrid2
void InitDataGrid2()
{
// 知道動態得到的dt,動態顯示到datagrid
int colCount = dt.Columns.Count;
for (int i = 0; i < colCount; ++i )
{
string colName = dt.Columns[i].ToString();
DataGridTemplateColumn column = new DataGridTemplateColumn();
column.Header = colName;
DataTemplate dataTemplate = new DataTemplate();
FrameworkElementFactory tbContent = new FrameworkElementFactory(typeof(TextBlock));
// 設置內容
tbContent.SetValue(TextBlock.TextProperty, new Binding(colName));
// 文字顏色
tbContent.SetValue(TextBlock.ForegroundProperty, Brushes.Black);
// 背景顏色
Binding bindBackColor = new Binding(colName);
bindBackColor.Converter = new ColorConvert();
tbContent.SetValue(TextBlock.BackgroundProperty, bindBackColor);
// 單元格長度,用浮點數。3.5版本下用整數會異常,其他版本不清楚
tbContent.SetValue(TextBlock.WidthProperty, 100.0);
dataTemplate.VisualTree = tbContent;
column.CellTemplate = dataTemplate;
dataGrid2.Columns.Add(column);
}
}
至於他的要求,我就不寫了。根據上面改一改就可以了。新上傳的例子:http://download.csdn.net/source/3462049(http://alsmile.download.csdn.net/)