Привязать строку вместо ячейки к конвертеру при использовании C# WPF DataGrid DataGridTemplateColumn - PullRequest
0 голосов
/ 02 апреля 2020

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

public class ExampleForSOBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string input = value as string;
        switch (input)
        {
            case "0":
            case "":
            case null:
                return Brushes.Red;                    
            default:
                return DependencyProperty.UnsetValue;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

И код стиля выглядит так:

<DataGridTemplateColumn.CellStyle>
                                    <Style TargetType="{x:Type DataGridCell}">
                                        <Setter Property="Background" Value="{Binding NameOfColumnInDataRow, Converter={StaticResource ExampleForSOBrushConverter}}"/>
                                    </Style>
                                </DataGridTemplateColumn.CellStyle>

Все, что это делает, это проверяет, введено ли значение в ячейку пусто, пусто или содержит 0 (выпадающий вариант по умолчанию для не выбранных). Пока это работает отлично, однако теперь мне нужно применить проверку для некоторых столбцов на основе других или с помощью других проверок, таких как длина текста. Например, если ColumnB равен 1, а Column C равен 3, или если ColumnD меньше 8 символов.

Мой план состоял в том, чтобы использовать параметры и передать строку следующим образом:

<DataGridTemplateColumn.CellStyle>
                                    <Style TargetType="{x:Type DataGridRow}">
                                        <Setter Property="Background" Value="{Binding Path=., Converter={StaticResource MultipleValidatorConverter}, ConverterParameter=LAR}"/>
                                    </Style>
                                </DataGridTemplateColumn.CellStyle>

И тогда конвертер будет выглядеть примерно так:

public class MultipleValidatorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        classNameUsedForItemsSource row = value as classNameUsedForItemsSource ;
        string param = parameter as string;

        if(param == "LAR")
        {
            if (param.Length < 8) return Brushes.Red;
        }
        // Other checks here based on parameter

        return DependencyProperty.UnsetValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

Но, к сожалению, это вызывает ошибку, говоря, что DataGridRow не соответствует targetttype DataGridCell, и теперь я застрял. Посмотрел в гугле и тут, но не смог найти соответствия для моего требования.

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

1 Ответ

0 голосов
/ 02 апреля 2020

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

public class IlrMultipleValidatorConverter : IMultiValueConverter
{
    public object Convert(object[] value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string param = parameter as string;

        if (param == "LAR")
        {
            string lar = value[0] as string;
            if (lar == null || lar == "") return Brushes.Red;
            else
            {
                if (lar.Length > 8) return Brushes.Red;
            }
        }
        if (param == "PwayCode")
        {
            string pway = value[0] as string;
            string ptype = value[1] as string;

            if (pway == null || pway == "")
            {
                if (ptype == "2" || ptype == "3" || ptype == "10" || ptype == "20" || ptype == "21" || ptype == "22" || ptype == "23") return Brushes.Red;
            }
        }


        return DependencyProperty.UnsetValue;
    }

    public object[] ConvertBack(object value, Type[] targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

Это позволяет мне добавить больше условий как I go для той же сетки, и установка каждого стиля для проверки была сделана следующим образом итак:

<DataGridTemplateColumn.CellStyle>
    <Style TargetType="{x:Type DataGridCell}">
        <Setter Property="Background">
           <Setter.Value>
              <MultiBinding>
                  <MultiBinding.Converter>
                       <local:IlrMultipleValidatorConverter />
                  </MultiBinding.Converter>
                  <MultiBinding.ConverterParameter>PwayCode</MultiBinding.ConverterParameter>
                  <Binding Path="ApprenticeshipPathway" />
                  <Binding Path="ProgrammeType" />
              </MultiBinding>
           </Setter.Value>
       </Setter>
    </Style>
</DataGridTemplateColumn.CellStyle>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...