如何使用视图模型值和查找字典设置数据网格行的背景颜色?

How to set the background color of a data grid row using a viewmodel value and a lookup dictionary?

我有一个 DataGrid,我在其中设置了 ItemsSource

TheGrid.ItemsSource = items;

还有一个XAML:

<DataGrid Name="TheGrid" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False">
  <DataGrid.Resources>
    <Style.Setters>
      <Setter Property = "Background" Value="{Binding = ???}" ></Setter>
    </Style.Setters>
  </DataGrid.Resources>
  <DataGrid.Columns>
    <DataGridTextColumn Header="Id" Binding="{Binding Id}"/>
    <DataGridTextColumn Header="Time" Binding="{Binding Time}"/>
    ...
  </DataGrid.Columns>
</DataGrid>

现在,在我看来,我有一个 public 字典:

public IDictionary<string, Color> IdColors { get; set; }

问题是我不知道如何从我的 ItemsSource 中获取 ID 并将其传递到绑定中,以便它可以访问该 ID 上的字典并获取颜色。 我已经阅读了替代解决方案,例如:

  1. 在转换器中执行此操作

  2. 正在订阅 LoadingRow 并以编程方式将其设置在那里

我想我知道如何做#2,但我来问堆栈是否可取。

如果你想定义一个转换器,你可以这样做:

public class IdToBrushConverter : IValueConverter {
    /// <summary>
    /// Converts an ID into a Brush
    /// </summary>
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        return new SolidColorBrush(IdColors[value]); //need for example some static access to IdColors here
        //You can also define IdColors here or use other custom logic.
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        throw new NotImplementedException();
    }
}

并且在您的 XAML 中,您可以这样调用转换器:

<DataGrid Name="TheGrid" AutoGenerateColumns="False" CanUserAddRows="False CanUserDeleteRows="False">
  <DataGrid.Resources>
    <!--You might need some namespace prefix here-->
    <view:IdToBrushConverter x:Key="IdToBrushConverter"></view:IdToBrushConverter>
    <Style.Setters>
      <Setter Property = "Background" Value="{Binding Path=Id, Converter={StaticResource IdToBrushConverter}" ></Setter>
    </Style.Setters>
  </DataGrid.Resources>
  <DataGrid.Columns>
    <DataGridTextColumn Header="Id" Binding="{Binding Id}"/>
    <DataGridTextColumn Header="Time" Binding="{Binding Time}"/>
    ...
  </DataGrid.Columns>
</DataGrid>

转换器将被调用并应用于 Id 属性 和 return 一个 SolidColorBrush 您想要的颜色。