Как установить цвет фона строки сетки данных, используя значение viewmodel и словарь поиска? - PullRequest
0 голосов
/ 22 сентября 2019

У меня есть 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 IDictionary<string, Color> IdColors { get; set; }

Проблема в том, что я не знаю, как взять идентификатор из моего ItemsSource и передать его в привязку так, чтобы он получал доступ к словарю по этому идентификатору и принимал цвет.Я прочитал альтернативные решения, такие как:

  1. Делаем это в конвертере

  2. Подписываемся на LoadingRow и просто устанавливаем его там программно

Я думаю, что знаю, как сделать # 2, но я пришел спросить у стека, будет ли это целесообразно.

1 Ответ

0 голосов
/ 22 сентября 2019

Если вы хотите определить конвертер, вы можете сделать это следующим образом:

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 и вернет SolidColorBrush нужного цвета.

...