업데이트 후 WPF DataGrid 셀 스타일 변경
-
21-12-2019 - |
문제
DataGrid가 생성 된 열이 생성되고 일부 조작 후 값이 변경된 셀 스타일을 변경해야합니다.
DataGrid의 ItemsSource는 List<MyTableRow>
로 정의됩니다. 여기서
public class MyTableRow
{
private string[] _values;
private string _rowHeader;
// getters and setters here
}
.
DataGrid 열은 다음 코드로 생성됩니다.
for (int i = 0; i < source[0].Values.Length; i++)
{
var col = new DataGridTextColumn();
var binding = new Binding("Values[" + i + "]");
col.Binding = binding;
col.CanUserSort = false;
this.dataGrid.Columns.Add(col);
this.dataGrid.Columns[i].Header = columnNames[i];
}
.
결과 DataGrid는 "nofollow">이
itemssource가 변경된 값이 변경된 셀 (굵은 텍스트 또는 컬러 배경) 셀을 강조하려고 할 때 문제가 발생합니다. 이 질문은 내 질문이 두 개로 나뉘는 지점을 보여줍니다 :
- 변경된 셀로 SMTH를 수행하는 "내장"방법이 있습니까? (어쩌면
ObservableColletion
또는 else) - 아니요, 인덱스 또는 그 값을 기반으로 별도의 셀을 어떻게 강조 표시 할 수 있습니까?
XAML 스타일 및 / 또는 트리거를 사용 하여이 작업을 시도했지만, 내가 어떤 가치있는 가치가 있는지 알지 못한다는 것을 알지 못했다
<Style TargetType="TextBlock">
<Setter Property="Background"
Value="{Binding <!-- some proper binding here -->,
Converter={StaticResource ValueToBrushConverter}}"/>
</Style>
.
다른 솔루션은 바인딩 또는 작동하지 않는 것과 동일한 "문제"가 동일합니다. 셀이며 전체 행 / 열이 아닌 셀을 강조 표시하기 위해 무엇을 할 수 있습니까? 필요한 경우 ItemsSource, MyTableRow
필드 및 / 또는 열의 생성 코드를 변경할 수 있습니다.
누구든지 나를 도와 줄 수 있습니까? 이 문제를 멈춘 이후 며칠이 지났습니다
업데이트 솔루션
해결책
마침내 내가 원하는 것을하는 방법을 알아보십시오.해결책은 "더러운"이지만, 나에게 잘 작동합니다. 나는
를 강조 해야하는 모든 셀에 비상없는 공간 문자를 첨가했습니다. private const string NBSP = "\u00A0"
그 후에 수행 할 수있는
가치 변환기를 만드는 것입니다.그래서 XAML에 MultiBinding
를 추가했습니다 :
<DataGrid.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="Background">
<Setter.Value>
<MultiBinding Converter="{StaticResource ValueToBrushMultiConverter}" >
<MultiBinding.Bindings>
<Binding RelativeSource="{RelativeSource Self}" />
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}}" />
</MultiBinding.Bindings>
</MultiBinding
</Setter.Value>
</Setter>
</Style>
</DataGrid.CellStyle>
.
다음과 같이 정의 된 Сonverter :
public class ValueToBrushMultiConverter : IMultiValueConverter
{
private const string NBSP = "\u00A0";
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var cell = (DataGridCell)values[0];
var dgRow = (DataGridRow)values[1];
var test = (dgRow.Item as TableRow<string, string>).Values[cell.Column.DisplayIndex];
if (test.Contains(NBSP))
return System.Windows.Media.Brushes.PaleGreen;
return DependencyProperty.UnsetValue;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
}
.
이것은 누군가를 돕습니다!