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

Sef*_*fix 4 c# wpf wpfdatagrid

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

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

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

kev*_*v22 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>
Run Code Online (Sandbox Code Playgroud)

如果要在运行时以编程方式添加列,并且希望将某种样式应用于它们,则仍可以在xaml中的设计时定义这些样式.

    <DataGrid AutoGenerateColumns="False" Name="dataGrid1">
        <DataGrid.Resources>
            <Style TargetType="{x:Type DataGridCell}" x:Key="MyCellStyle">
                <Setter Property="Foreground" Value="Green"/>
            </Style>
        </DataGrid.Resources>
        ...
Run Code Online (Sandbox Code Playgroud)

然后,当您添加列时,可以将该样式应用于它们:

col.CellStyle = (Style)dataGrid1.Resources("MyCellStyle");
Run Code Online (Sandbox Code Playgroud)

更新

如果您有一个歌曲列表,并且想要更改每首歌曲的行颜色,而该歌曲的名称以"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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以在你的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>
Run Code Online (Sandbox Code Playgroud)

注意我如何将"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();
    }
}
Run Code Online (Sandbox Code Playgroud)

传入的第一个参数是艺术家名称,第二个是字母.

你会在你的网格中使用它,如下所示:

        <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>
Run Code Online (Sandbox Code Playgroud)

在此示例中,第一个字母来自名为"FirstLetter"的控件的"Text"属性.您可以将绑定更改为您想要的任何内容.