내 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
이의 DataGrid
및 SelectedItem
유형을 z
.
색상을에 바인딩 할 수 SelectedItem
있지만이 경우 DataGrid
.
하나의 속성에 따라이 행 배경색을 어떻게 변경할 수 있습니까?
답변
사용 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>
답변
이것 없이도 똑같이 할 수 있습니다 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();
}
}
답변
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