데이터 바인딩을 사용하여 속성 값을 기반으로 DataGrid의 행 배경을 설정하는 방법


81

내 XAML 코드 Background에서 특정 행의 개체 값을 기반으로 각 행 의 색상 을 설정하려고합니다 . 나는이 ObservableCollection의를 z하고, 각각 z라는 속성이 있습니다 State. 나는 내에서 이와 같은 것으로 시작했다 DataGrid.

<DataGrid.RowStyle>
    <Style TargetType="DataGridRow">
        <Setter Property="Background" 
                Value="{Binding z.StateId, Converter={StaticResource StateIdToColorConverter}}"/>
     </Style>
</DataGrid.RowStyle>

x는 내 ViewModel 클래스의 속성이 아니기 때문에 잘못된 접근 방식입니다.

내 뷰 모델 클래스에서 나는이 ObservableCollection<z>ItemsSource이의 DataGridSelectedItem유형을 z.

색상을에 바인딩 할 수 SelectedItem있지만이 경우 DataGrid.

하나의 속성에 따라이 행 배경색을 어떻게 변경할 수 있습니까?

답변:


171

사용 DataTrigger:

<DataGrid ItemsSource="{Binding YourItemsSource}">
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow"> 
            <Style.Triggers>
                <DataTrigger Binding="{Binding State}" Value="State1">
                    <Setter Property="Background" Value="Red"></Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding State}" Value="State2">
                    <Setter Property="Background" Value="Green"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.RowStyle>
</DataGrid>

2
나는 단지 얻는다 : BindingExpression 경로 오류 : 'State' property not found on 'object' ''z' (HashCode=7162954)'. BindingExpression:Path=State; DataItem='z' (HashCode=7162954); target element is 'DataGridRow' (Name=''); target property is 'NoTarget' (type 'Object')내 엔터티가 이것을 보유 할 때 속성 상태를 찾지 못하고 내 데이터베이스에 상태가 열로 표시되는 이유는 무엇입니까?
Tobias Moe Thorstensen

2
나는 당신이 그것을 z.State.
Nitesh

4
wpf에서 시간을 보낸 후 다시 이것을 발견했습니다.
Ric

5
이것은 훌륭합니다. 내가 사용한 솔루션에서는 enum값 에 따라 상태를 변경해야했습니다 . StackOverflow에 대한이 답변 은 저에게 도움이되었습니다.
kaspermoerch 2015 년

당신이 묶는 재산이 있어야한다는 것을 잊지 마세요public
CAD

17

이것 없이도 똑같이 할 수 있습니다 DataTrigger.

 <DataGrid.RowStyle>
     <Style TargetType="DataGridRow">
         <Setter Property="Background" >
             <Setter.Value>
                 <Binding Path="State" Converter="{StaticResource BooleanToBrushConverter}">
                     <Binding.ConverterParameter>
                         <x:Array Type="SolidColorBrush">
                             <SolidColorBrush Color="{StaticResource RedColor}"/>
                             <SolidColorBrush Color="{StaticResource TransparentColor}"/>
                         </x:Array>
                     </Binding.ConverterParameter>
                 </Binding>
             </Setter.Value>
         </Setter>
     </Style>
 </DataGrid.RowStyle>

BooleanToBrushConverter다음 클래스는 어디에 있습니까?

public class BooleanToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
            return Brushes.Transparent;

        Brush[] brushes = parameter as Brush[];
        if (brushes == null)
            return Brushes.Transparent;

        bool isTrue;
        bool.TryParse(value.ToString(), out isTrue);

        if (isTrue)
        {
            var brush =  (SolidColorBrush)brushes[0];
            return brush ?? Brushes.Transparent;
        }
        else
        {
            var brush = (SolidColorBrush)brushes[1];
            return brush ?? Brushes.Transparent;
        }
    }

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

IMultiValueConverter ( docs.microsoft.com/en-us/dotnet/api/… )를 적용하여 둘 이상의 속성을 간단히 바인딩하고 변환기가 이러한 여러 속성의 상태에 대해 올바른 색상을 반환하도록 하는 것이 훨씬 더 좋습니다 ( 생략 일반 컨버터 경우에 그 정말 비슷한 이후 샘플하지만 난 게시 할 수는해야 사람이 필요 그것을)
user8276908

7

XAML에서 추가하고 정의 DataGrid에 대한 RowStyle 속성 세트에 목표 행의 배경을 받는 사람, 색상 내 직원 개체에 정의.

<DataGrid AutoGenerateColumns="False" ItemsSource="EmployeeList">
   <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
             <Setter Property="Background" Value="{Binding ColorSet}"/>
        </Style>
   </DataGrid.RowStyle>

그리고 내 직원 클래스에서

public class Employee {

    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }

    public string ColorSet { get; set; }

    public Employee() { }

    public Employee(int id, string name, int age)
    {
        Id = id;
        Name = name;
        Age = age;
        if (Age > 50)
        {
            ColorSet = "Green";
        }
        else if (Age > 100)
        {
            ColorSet = "Red";
        }
        else
        {
            ColorSet = "White";
        }
    }
}

이런 식으로 DataGrid의 모든 은 내 Object 속성의 배경색 을 갖습니다 .ColorSet


객체의 색상이 뷰가 아닌 모델 자체에 집중되어 있기 때문에이 방법을 좋아합니다.
ΩmegaMan

1
이것이 MVVM을 위반하는 것을 제외하고. 당신이 상관하지 않으면 그것을 가지고 있습니다. 그러나 사용자 경험은 모델에 의해 결정되어서는 안됩니다. 이것이 View / View Model의 작업입니다
BrianVPS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.