c# - 如何根据行数据动态改变行的样式?

标签 c# wpf datagrid

如何在运行时为 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/

相关文章:

c# - Xamarin/Mvvmcross : Open a different view controller when a iOS push notification is received

c# - C# 中的一个程序,用于判断打开的应用程序是否处于最大化模式

c# - WPF 流文档布局

c# - DataGrid - 更改编辑行为

c# - 单击 "X"按钮时要求确认

c# - 启动时打开文件

c# - Prism 5 模块化 : how to add RegionName in DataTemplate of TabControl in ItemsControl

c# - 如何从一维 int 数组返回数字网格?

c# - WPF 数据网格 : Issue regarding virtualization of selected cells outside of visible area

c# - 在以下示例中,使用 LINQ 查询相关表的最佳实践是什么?