WPF에서 DataGrid를 사용하다 보면 특정 DataGridTextColumn에 Forground 또는 Background 색상을 설정해야 할 필요가 있다. Dynamic 하게 표시하기 위해서 열 단위로 생성하는 경우, Thread 내부에서 데이터 바인딩을 통해 설정한 Foreground 색상을 설정하고 실행해 보면 색 설정이 적용되지 않은 경우가 있는데, Foreground 또는 Background와 같은 특정 속성에 대해서는 Freeze()를 해줘야만 적용된다.
아래와 같이 DataTextColumn에서 Name 헤더의 글자색, Foreground를 상태에 따라 변경하고싶은 경우,
Foreground에 대하여 ForeColor로 바인딩 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<DataGrid x:Name="dtgrid" Grid.Row="1" Margin="0" AutoGenerateColumns="False" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility ="Auto"
HorizontalGridLinesBrush="Gainsboro" VerticalGridLinesBrush="Gainsboro" RowHeight="20" CanUserAddRows="False" CanUserDeleteRows="True"
HeadersVisibility="None" CanUserReorderColumns="False" CanUserResizeColumns="False" FontSize="11" >
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" Width="75" IsReadOnly="True" >
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="Foreground" Value="{Binding ForeColor}"/>
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
|
cs |
이후 코드에서 설정하기 위해서 DataGridPair라는 바인딩 클래스를 생성하고
DataGrid(dataGrid)의 ItemsSource를 _dtgrdData로 정의한다.
_dtgrdData는 ObservableCollection<DataGridPair> 이며, 이후 캐스팅을 통해 값을 가져올 수 있도록 ObservableCollection으로 정의했다.
버튼 클릭 이벤트로 _dtgrdData에 DataGridPair를 추가하면 UI의 DataGrid에 자동으로 표시되게 된다.
이때 Foreground 바인딩 변수인 ForeColor에 색을 설정했다면, 반드시 그 아래에 ForeColor.Freeze(); 코드를 적용해야만 에러가 발생하지 않고 Foreground가 적용된다.
(Background를 설정하는 경우에도 마찬가지로 Freeze를 적용해야 한다.)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
using System.Collections.ObjectModel;
//ObservableCollection으로 정의
ObservableCollection<DataGridPair> _dtgrdData = new ObservableCollection<DataGridPair>();
public Parent()
{
InitializeComponent();
// ItemSource 정의
dataGrid.ItemsSource = _dtgrdData;
}
// DataGrid - DataGridTextColumn에 바인딩하여 사용하는 클래스
public class DataGridPair
{
public string Name { get; set; }
public int Age { get; set; }
public int Grade { get; set; }
public SolidColorBrush ForeColor { get; set; }
}
private async void button_Click(object sender, RoutedEventArgs e)
{
// 입력할 정보
List<Tuple<string, int, int>> info = new List<Tuple<string, int, int>>
{
Tuple.Create("John", 23, 1),
Tuple.Create("Park", 28, 1),
Tuple.Create("Min", 25, 2),
};
await Task.Run(() =>
{
for(int k = 0; k < info.Count; k++)
{
// DataGridPair에 변수 담기
var item = new DataGridPair();
item.Name = info[k].Item1;
item.Age = info[k].Item2;
item.Grade = info[k].Item3;
// Foreground Color 설정
if(item.Age > 25)
{ item.ForeColor = new SolidColorBrush(Color.FromArgb(255, 0, 0, 255)); }
else
{ item.ForeColor = new SolidColorBrush(Color.FromArgb(255, 0, 0, 0)); }
item.ForeColor.Freeze(); // Freeze()를 설정해야 적용됨
_dtgrdData.Add(item);
}
});
}
|
cs |
'프로그래밍 언어 > WPF' 카테고리의 다른 글
[C#] WPF - UI의 모든 컨트롤 가져오기 (0) | 2024.01.05 |
---|---|
[C#] WPF - 토글 스위치(Toggle Switch) 생성 (2) | 2023.12.26 |
[C#] WPF - 특정 프로세스 Focus 여부 판단 방법 (0) | 2023.01.09 |
[C#] Form에서 다른 Form으로 데이터 전송하는 방법 (0) | 2022.10.25 |
[C#] TreeView 상위 노드 체크시 하위 노드 연동 (0) | 2022.01.07 |
댓글