2016-01-26 3 views
0

Надеюсь, я смогу это объяснить ....
Мы связываем наш DataGrid с коллекцией, которая исходит из некоторого источника данных. Атрибуты для каждого столбца описаны в другой коллекции, поэтому мы создаем столбцы во время выполнения и устанавливаем свойства в столбце (только для чтения), основываясь на значениях в коллекции атрибутов.Программно привязать конвертер к столбцу в DataGrid

Новое требование является обязательным атрибутом. Для столбцов, которые необходимы, я хотел бы привязать конвертер, который устанавливает цвет фона DataGridCell на основе значения. (Простейший случай конвертера был бы каким-то цветом, если ячейка была пустой, и была бы белой, если бы пользователь ввел значение. Я уверен, что в будущем ожидается более сложная проверка.)

Я думаю, это можно сделать в чем-то вроде того, что я ковырялся с компанией:

<Style TargetType="{x:Type DataGridCell}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGridCell}"> 
       <Border BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}" 
         Background="{TemplateBinding Background}" 
         SnapsToDevicePixels="True"> 
        <TextBox Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content.Text}"> 
        </TextBox> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

(Еще нужно добавить конвертер где-то ....)
Или то, что я хочу сделать, должно быть сделано в код-позади? Любые указатели были бы оценены ...

ответ

0

Вот один из способов сделать это. IDK, если это лучший способ, но он работает, и прошло несколько часов с тех пор, как вы спросили об этом.

Ваш DataGridCell заполнен рамкой/текстовым полем, поэтому я предполагаю, что вы хотите изменить цвет фона текстового поля поскольку вы не увидите фон DataGridCell.

Поскольку вы упомянули, что в будущем могут быть более сложные сценарии, я использовал многосвязывание с конвертером и передал в текстовые поля datacontext (используя < Binding/>), и это текстовое значение.

<Style TargetType="{x:Type DataGridCell}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGridCell}"> 
       <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True"> 
        <TextBox Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content.Text}"> 
         <TextBox.Resources> 
          <local:ValidationBGConverter x:Key="ValidationBGConverter" /> 
         </TextBox.Resources> 
         <TextBox.Style> 
          <Style TargetType="TextBox"> 
           <Setter Property="Background"> 
            <Setter.Value> 
             <MultiBinding Converter="{StaticResource ValidationBGConverter}"> 
              <Binding /> 
              <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Content.Text" /> 
             </MultiBinding> 
            </Setter.Value> 
           </Setter> 
          </Style> 
         </TextBox.Style> 
        </TextBox> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

А вот преобразователь:

public class ValidationBGConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (values.Length != 2) 
      return Brushes.Black; 
     var datacontext = values[0] as ViewData; // Or whatever the textbox's datacontext object is 
     if (datacontext != null) // If null, probably the new item row 
     { 
      var txt = values[1] as string; // Textbox text 
      if (string.IsNullOrWhiteSpace(txt)) 
       return Brushes.Red; 
      if (txt.Length < 3) 
       return Brushes.Pink; 
      if (txt.Length > 5) 
       return new LinearGradientBrush(Colors.White, Colors.Blue, 90.0); 
     } 
     return Brushes.White; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

И скриншот:

enter image description here

+0

Очень полезно, спасибо. В частности, речь идет о передаче DataContext в качестве параметра: . – Number8

+0

Добро пожаловать. Можете ли вы принять ответ? Благодарю. –

Смежные вопросы