문제

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가 변경된 값이 변경된 셀 (굵은 텍스트 또는 컬러 배경) 셀을 강조하려고 할 때 문제가 발생합니다. 이 질문은 내 질문이 두 개로 나뉘는 지점을 보여줍니다 :

  1. 변경된 셀로 SMTH를 수행하는 "내장"방법이 있습니까? (어쩌면 ObservableColletion 또는 else)
  2. 아니요, 인덱스 또는 그 값을 기반으로 별도의 셀을 어떻게 강조 표시 할 수 있습니까?
  3. 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();
        }
    }
.

이것은 누군가를 돕습니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top