如何在WPF Datagrid中更改行的样式?

时间:2011-08-19 13:16:26

标签: c# wpf wpfdatagrid

我是WPF的新手,需要帮助在运行时设置数据网格中的特定行或样式,具体取决于存储数据的某些值。 我看到了这个thread但是无法解决我在运行时只存在的行问题 设计中存在的列。

任何一个例子都会很乐意接受。 谢谢!

编辑:我也找到了这个thread,但我需要一个C#代码......

1 个答案:

答案 0 :(得分:19)

我无法从您的问题中判断您是否在运行时向网格添加列,但无论哪种方式,您都可以在设计时将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”属性。您可以将绑定更改为您想要的任何内容。