如何在运行时为 WPF Datagrid
中的特定行设置样式?每个变化都取决于显示数据的某些值?
最佳答案
我无法从您的问题中判断您是否在运行时向网格添加列,但无论哪种方式,您都可以在设计时将 CellStyle 添加到网格以使用 DataTriggers 处理您的特定样式需求。
例如,以下将使 Name 属性 = "Billy Bob"的所有行变为红色:
<DataGrid AutoGenerateColumns="True" Name="dataGrid1">
<DataGrid.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<DataTrigger Binding="{Binding Name}" Value="Billy Bob" >
<Setter Property="Background" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
</DataGrid>
如果您在运行时以编程方式添加列,并且希望对它们应用某种样式,您仍然可以在设计时在您的 xaml 中定义这些样式。
<DataGrid AutoGenerateColumns="False" Name="dataGrid1">
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridCell}" x:Key="MyCellStyle">
<Setter Property="Foreground" Value="Green"/>
</Style>
</DataGrid.Resources>
...
然后当您添加列时,您可以对它们应用该样式:
col.CellStyle = (Style)dataGrid1.Resources("MyCellStyle");
更新
如果您有一个歌曲列表,并且您想要更改其名称以“a”开头的艺术家的每首歌曲的行颜色,那么您可以使用 IValueConverter。
下面的转换器可以解决这个问题:
public class ArtistNameConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
try
{
return value.ToString().StartsWith(parameter.ToString());
}
catch
{
return false;
}
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
然后您可以像这样在您的 xaml 中使用转换器:
<DataGrid AutoGenerateColumns="True" Name="dataGrid1">
<DataGrid.Resources>
<converters:ArtistNameConverter x:Key="ArtistNameConverter"></converters:ArtistNameConverter>
</DataGrid.Resources>
<DataGrid.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<DataTrigger Binding="{Binding ArtistName, Converter={StaticResource ArtistNameConverter}, ConverterParameter=a}" Value="True" >
<Setter Property="Background" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
</DataGrid>
请注意我是如何将“a”作为参数传递给转换器的。您可以传入任何您想要的字母,以该字母开头的艺术家的行的背景颜色将设置为红色。
更新 2
如果您想将某种变量传递给转换器,您可以使用 MultiBinding。
转换器看起来像这样:
public class ArtistNameConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
try
{
return values[0].ToString().StartsWith(values[1].ToString());
}
catch
{
return false;
}
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter,
System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
传入的第一个参数是艺人姓名,第二个是字母。
你会像这样在你的网格中使用它:
<DataGrid.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<DataTrigger Value="True" >
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource ArtistNameConverter}">
<Binding Path="ArtistName" />
<Binding Mode="OneWay" ElementName="FirstLetter" Path="Text" />
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Background" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
在此示例中,第一个字母来自名为“FirstLetter”的控件的“Text”属性。您可以将该绑定(bind)更改为您想要的任何内容。
关于c# - 如何根据行数据动态改变行的样式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7122131/