WPF DataGrid의 LoadingRow 이벤트에서 행 색상을 번갈아 가며 행 색상을 두 배로 늘립니다.

제이크 헤이 튼

LoadingRow 이벤트를 통해 프로그래밍 방식으로 행 색상을 교체하고 있습니다. 그 이유는 일부 행, 즉 삭제 표시된 행과 수정 된 데이터가있는 행에 특정 색상을 지정해야하기 때문입니다.

이것은 DataGrid에서 위로 스크롤하고 행 색상을 두 배 또는 세 배로 늘리는 매우 이상한 상호 작용을 얻을 때까지 잘 작동합니다.

여기에 이미지 설명 입력

아래로 스크롤 할 때 올바르게 표시됩니다.

AlternationCount를 2로 설정 한 상태에서 AlternationIndex를 사용해 보았고 bool을 사용하여 사이를 전환하면 둘 다 똑같은 문제가 발생합니다.

LoadingRow 이벤트에서 이것을 설정하지 않고 DataGrid AlternatingRowBackground를 사용하면 테이블을 스크롤 할 때 행 색상이 다른 행으로 번집니다.

private void dataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
        {
            // Get the DataRow corresponding to the DataGridRow that is loading.
            var item = e.Row.Item as ExpandoObject;
            if (loadedTable.ToDelete.Contains(item))
            {
                e.Row.Background = new SolidColorBrush(Colors.OrangeRed);
                return;
            }
            else if (loadedTable.Modified.Contains(loadedTable.Rows.IndexOf(item)))
            {
                e.Row.Background = new SolidColorBrush(Colors.LightYellow);
                return;
            }
            else if (e.Row.AlternationIndex == 0)
            {
                e.Row.Background = new SolidColorBrush(Colors.WhiteSmoke);
            }
            else if (e.Row.AlternationIndex == 1)
            {
                e.Row.Background = new SolidColorBrush(Colors.LightGray);
            }
        }
<DataGrid CanUserAddRows="False" GridLinesVisibility="All" VerticalGridLinesBrush="Gray" HorizontalGridLinesBrush="Gray"
                                 FontSize="15" FrozenColumnCount ="1" x:Name="xmlData" EnableRowVirtualization="True" AlternationCount="1"
                                 AlternatingRowBackground="LightGray" Background="WhiteSmoke"
                                 Grid.Column="1" Margin="0,-31,5,10" AutoGenerateColumns="False" Grid.Row="2" SelectionUnit="Cell" 
                                 PreviewKeyDown="DataGridKeyDown_Event" IsReadOnly="True" CanUserDeleteRows="True"
                                 LoadingRow="dataGrid_LoadingRow"/>
JH

문제는 DataGrid가 DataGridRow 개체를 재사용하기 때문입니다 (EnableRowVirtualization = "False"를 시도 할 수 있음).

원하는 것은 스타일을 사용하여 데이터 / 항목을 기반으로 DataGridRow의 배경을 설정하는 것입니다.

다음은 원하는 작업을 수행하는 테스트 앱입니다.

XAML

<Window x:Class="WpfApp9.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApp9"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Window.DataContext>
    <local:VM />
</Window.DataContext>
<Grid>
    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Items}" AlternationCount="2">
        <DataGrid.Resources>
            <!-- Converter used to convert the DataRow's Item and the VM.ToDelete list to bool (true = it is deleted) -->
            <local:IsDeletedConverter x:Key="IsDeletedConverter" />
        </DataGrid.Resources>
        <DataGrid.RowStyle>
            <Style TargetType="DataGridRow">
                <Style.Triggers>
                    <!-- Setup the background color for normal rows using AlternationIndex -->
                    <Trigger Property="ItemsControl.AlternationIndex" Value="0">
                        <Setter Property="Background" Value="WhiteSmoke" />
                    </Trigger>
                    <Trigger Property="ItemsControl.AlternationIndex" Value="1">
                        <Setter Property="Background" Value="LightGray" />
                    </Trigger>
                    <!-- Override the above background colors if it is in the deleted list - NOTE: these styles are processed in order, make sure this is after the above triggers -->
                    <DataTrigger Value="True">
                        <DataTrigger.Binding>
                            <MultiBinding Converter="{StaticResource IsDeletedConverter}">
                                <!-- This is the DataContext of the DataGridRow - the item (ExpandoObject) we will check for in the deleted list -->
                                <Binding />
                                <!-- Need the deleted list, which is in VM -->
                                <Binding RelativeSource="{RelativeSource AncestorType=Window}" Path="DataContext" />
                            </MultiBinding>
                        </DataTrigger.Binding>
                        <DataTrigger.Setters>
                            <Setter Property="Background" Value="OrangeRed" />
                        </DataTrigger.Setters>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </DataGrid.RowStyle>
        <DataGrid.Columns>
            <DataGridTextColumn Header="Col1" Binding="{Binding Col1}" />
            <DataGridTextColumn Header="Col2" Binding="{Binding Col2}" />
        </DataGrid.Columns>
    </DataGrid>
</Grid>

암호

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

namespace WpfApp9
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }

    public class VM
    {
        public List<System.Dynamic.ExpandoObject> Items { get; set; }
        public List<System.Dynamic.ExpandoObject> ToDelete { get; set; }

        public VM()
        {
            Items = new List<System.Dynamic.ExpandoObject>();
            ToDelete = new List<System.Dynamic.ExpandoObject>();

            for (int i = 0; i < 1000; i++)
            {
                var eo = new System.Dynamic.ExpandoObject();
                var d = eo as IDictionary<string, object>;
                d["Col1"] = $"String {i}";
                d["Col2"] = i;
                Items.Add(eo);

                // Add some items to ToDelete list
                if (i % 10 == 0)
                {
                    ToDelete.Add(eo);
                }
            }
        }
    }

    public class IsDeletedConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if (values.Length != 2)
                throw new ArgumentException($"IsDeletedConverter is expecting 2 values but got {values.Length} values!", nameof(values));

            if (values[0] is System.Dynamic.ExpandoObject eo && values[1] is VM vm)
            {
                if (vm.ToDelete.Contains(eo))
                    return true;
            }
            return false;
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

선행 문자열 (책 색인의 경우)에서 조건부 하나 이상 (쉼표로 구분)을 제외한 모든 숫자를 늘립니다.

분류에서Dev

각 행에 대해 전송되는 열을 번갈아 가며 별도의 열에있는 목록을 재구성하는 방법은 무엇입니까?

분류에서Dev

두 배열을 C에서 번갈아 가며 단일 배열로 병합하는 방법은 무엇입니까?

분류에서Dev

해당 행의 아무 곳이나 마우스를 가져갈 때 TableRow 열의 아이콘 색상을 변경할 수 있습니까?

분류에서Dev

WPF에서 DataGridRow 색상과 교대로 행 색상을 설정하는 방법은 무엇입니까?

분류에서Dev

웹 사이트의 배경을 두 가지 색상으로 어떻게 색칠합니까?

분류에서Dev

PyqQt 코드에서 QLabel / QPushButton의 색상을 빨간색 ( "바쁨"상태 표시)으로 변경하고 실행 후 다시 돌아옵니다.

분류에서Dev

컬러 행을 번갈아 가며 테이블. 속성이있는 테이블 행에 스타일을 유지하고 다른 tr은 건너 뜁니다. 가급적 CSS로 수행

분류에서Dev

목록에서 배경색을 번갈아 가독성 향상

분류에서Dev

UITableviewCell에서 3 가지 색상을 번갈아 가며

분류에서Dev

ansii 색상의 에코가 내 텍스트를 두 배로 늘립니다 (zsh, mac).

분류에서Dev

색상 행을 번갈아 가며 구문 분석 오류

분류에서Dev

WPF DataGrid, DataGrid에서 선택된 행 색상 MVVM의 SelectedItem 변경

분류에서Dev

두 개의 다른 배열에서 인쇄 요소를 번갈아 가며 어떻게합니까?

분류에서Dev

WPF DataGrid 색상 지정-행과 셀 모두에 대한 사용자 지정 색상 지정

분류에서Dev

값의 독립성이있는 세로 막 대형 차트에서 두 가지 색상을 번갈아 표시

분류에서Dev

검색어를 제외하고 두 개 이상의 단어가있는 행을 삭제합니다.

분류에서Dev

표 본문 사이의 색상을 번갈아 가며 어떻게 할 수 있습니까? CSS

분류에서Dev

WPF MVVM은 Grid / DataGrid에 두 개의 컨트롤이있는 행을 동적으로 추가합니다.

분류에서Dev

WPF는 DataGridTextColumn의 배경색을 행별로 색상으로 바인드합니다.

분류에서Dev

두 개의 개별 배열 내에 질문과 답변을 나열하고 두 텍스트보기에서 번갈아 가며 반환하는 방법

분류에서Dev

하나의 선택기로 3 요소마다 두 가지 색상을 번갈아 가며

분류에서Dev

wpf의 Datagrid에서 검색을 수행하는 데 가장 적합한 도구는 무엇입니까?

분류에서Dev

MATLAB에서 특정 색상과 모양으로 특정 행렬의 첫 번째 열을 드로우합니다.

분류에서Dev

파이썬에서 두 개의 목록을 번갈아 가며 반복

분류에서Dev

값 변경에 따라 행 그룹에 대해 두 가지 색상을 번갈아 사용하는 조건부 형식

분류에서Dev

두 인덱스 배열의 값을 번갈아 가며 에코하는 방법은 무엇입니까?

분류에서Dev

행 그룹을 번갈아 가며 색상을 지정하는 매크로

분류에서Dev

행 데이터 유형별로 번갈아 가며 gridview 행 배경색 설정

Related 관련 기사

  1. 1

    선행 문자열 (책 색인의 경우)에서 조건부 하나 이상 (쉼표로 구분)을 제외한 모든 숫자를 늘립니다.

  2. 2

    각 행에 대해 전송되는 열을 번갈아 가며 별도의 열에있는 목록을 재구성하는 방법은 무엇입니까?

  3. 3

    두 배열을 C에서 번갈아 가며 단일 배열로 병합하는 방법은 무엇입니까?

  4. 4

    해당 행의 아무 곳이나 마우스를 가져갈 때 TableRow 열의 아이콘 색상을 변경할 수 있습니까?

  5. 5

    WPF에서 DataGridRow 색상과 교대로 행 색상을 설정하는 방법은 무엇입니까?

  6. 6

    웹 사이트의 배경을 두 가지 색상으로 어떻게 색칠합니까?

  7. 7

    PyqQt 코드에서 QLabel / QPushButton의 색상을 빨간색 ( "바쁨"상태 표시)으로 변경하고 실행 후 다시 돌아옵니다.

  8. 8

    컬러 행을 번갈아 가며 테이블. 속성이있는 테이블 행에 스타일을 유지하고 다른 tr은 건너 뜁니다. 가급적 CSS로 수행

  9. 9

    목록에서 배경색을 번갈아 가독성 향상

  10. 10

    UITableviewCell에서 3 가지 색상을 번갈아 가며

  11. 11

    ansii 색상의 에코가 내 텍스트를 두 배로 늘립니다 (zsh, mac).

  12. 12

    색상 행을 번갈아 가며 구문 분석 오류

  13. 13

    WPF DataGrid, DataGrid에서 선택된 행 색상 MVVM의 SelectedItem 변경

  14. 14

    두 개의 다른 배열에서 인쇄 요소를 번갈아 가며 어떻게합니까?

  15. 15

    WPF DataGrid 색상 지정-행과 셀 모두에 대한 사용자 지정 색상 지정

  16. 16

    값의 독립성이있는 세로 막 대형 차트에서 두 가지 색상을 번갈아 표시

  17. 17

    검색어를 제외하고 두 개 이상의 단어가있는 행을 삭제합니다.

  18. 18

    표 본문 사이의 색상을 번갈아 가며 어떻게 할 수 있습니까? CSS

  19. 19

    WPF MVVM은 Grid / DataGrid에 두 개의 컨트롤이있는 행을 동적으로 추가합니다.

  20. 20

    WPF는 DataGridTextColumn의 배경색을 행별로 색상으로 바인드합니다.

  21. 21

    두 개의 개별 배열 내에 질문과 답변을 나열하고 두 텍스트보기에서 번갈아 가며 반환하는 방법

  22. 22

    하나의 선택기로 3 요소마다 두 가지 색상을 번갈아 가며

  23. 23

    wpf의 Datagrid에서 검색을 수행하는 데 가장 적합한 도구는 무엇입니까?

  24. 24

    MATLAB에서 특정 색상과 모양으로 특정 행렬의 첫 번째 열을 드로우합니다.

  25. 25

    파이썬에서 두 개의 목록을 번갈아 가며 반복

  26. 26

    값 변경에 따라 행 그룹에 대해 두 가지 색상을 번갈아 사용하는 조건부 형식

  27. 27

    두 인덱스 배열의 값을 번갈아 가며 에코하는 방법은 무엇입니까?

  28. 28

    행 그룹을 번갈아 가며 색상을 지정하는 매크로

  29. 29

    행 데이터 유형별로 번갈아 가며 gridview 행 배경색 설정

뜨겁다태그

보관