Как изменить стиль строки в WPF Datagrid? - PullRequest
4 голосов
/ 19 августа 2011

Я новичок в WPF и мне нужна помощь в стилизации конкретной строки или строк в сетке данных во время выполнения, в зависимости от некоторых значений хранимых данных.Я видел этот поток , но не смог решить мою проблему со строкой, которая существует только во время выполнения, из столбцов, которые существуют в дизайне.

любой пример будет с радостью принят.спасибо!

отредактировано: я нашел эту тему тоже, но мне нужен код C # ...

1 Ответ

19 голосов
/ 30 августа 2011

По вашему вопросу я не могу сказать, добавляете ли вы столбцы в сетку во время выполнения, но в любом случае вы можете добавить 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>

Обратите внимание, как я передаю "а" в преобразователь в качестве параметра. Вы можете передать любую нужную букву, и строки, в которых есть исполнители, начинающиеся с этой буквы, будут иметь цвет фона, заданный красным.

Обновление 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>

В этом примере первая буква исходит от свойства «Text» элемента управления «FirstLetter». Вы можете изменить эту привязку на что угодно.

...