如何使用视图模型值和查找字典设置数据网格行的背景颜色?
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 上的字典并获取颜色。
我已经阅读了替代解决方案,例如:
在转换器中执行此操作
正在订阅 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
您想要的颜色。
我有一个 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 上的字典并获取颜色。
我已经阅读了替代解决方案,例如:
在转换器中执行此操作
正在订阅
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
您想要的颜色。