如何使用数据绑定基于属性值设置DataGrid的行背景


81

在我的XAML代码中,我想Background基于某一特定行中对象的值设置每一行的颜色。我有一个ObservableCollectionz,并且每个z有一个叫做财产State。我从我的开始就是这样的DataGrid

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

这是错误的方法,因为x不是我的ViewModel类中的属性。

在我的ViewModel类中,我具有this的ObservableCollection<z>which和type的。ItemsSourceDataGridSelectedItemz

我可以将颜色绑定到上SelectedItem,但是这样只会改变一行中的颜色DataGrid

如何基于一个属性更改此行的backgroundcolor?

Answers:


168

使用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

不要忘记您绑定的属性必须是public
CAD bloke

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属性,其目标是将RowBackground设置为在Employee对象中定义Color。

<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的行具有背景色的的ColorSet 我的对象的属性


我喜欢这种方法,因为对象的颜色集中在模型本身而不是视图中。
ΩmegaMan

1
但这违反了MVVM。如果您不在乎,请尝试一下。但是用户体验不应由模型确定。这就是视图/视图模型的工作
BrianVPS
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.