Раскраска WPF DataGridRows одна за другой - PullRequest
2 голосов
/ 12 января 2010

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

Вот код, который я использую.

private void Red_Click(object sender, RoutedEventArgs e)
{
    for (int i = 0; i < dataGrid1.Items.Count; i++)
    {
        DataGridRow row = (DataGridRow)dataGrid1.ItemContainerGenerator.ContainerFromIndex(i);
        if (row != null)
        {
            row.Background = Brushes.Red;
        }
    }
}

Есть ли другой способ покрасить строки одна за другой с помощью других методов, или это какая-то ошибка в wpftoolkit?

Ответы [ 3 ]

4 голосов
/ 12 января 2010

Если вы хотите определить цвета для каждой строки, и у вас есть свойство для элементов, отображаемых в строках, вы можете использовать ItemsContainerStyle, чтобы установить цвет строки. В приведенном ниже примере у вас будет свойство ItemColour для ваших элементов в сетке, которое будет определять цвет строки фона. Привязка привязывает строку к элементу, который содержит строка.

 <dg:DataGrid.ItemContainerStyle>
    <Style
       TargetType="{x:Type dg:DataGridRow}"
       BasedOn="{StaticResource {x:Type dg:DataGridRow}}">
       <Setter
          Property="Background"
          Value="{Binding ItemColour}" />
    </Style>
 </dg:DataGrid.ItemContainerStyle>

Но вам может не потребоваться свойство ItemColour для ваших товаров, поскольку они могут быть вашей бизнес-моделью. Это где ViewModel вступает в свои права. Вы определяете средний уровень, который обертывает ваш бизнес-уровень, и свойство ItemColour на основе некоторой пользовательской логики.

2 голосов
/ 12 января 2010

Если вы хотите установить фон для всех строк вашей сетки, вы можете определить новый объект стиля строки и установить его свойство Background; это должно изменить фон всех строк сразу, без необходимости перебирать их. Что-то вроде этого:

dataGrid1.RowStyle = new Style(typeof(DataGridRow));
dataGrid1.RowStyle.Setters.Add(new Setter(Control.BackgroundProperty, new SolidColorBrush(Colors.Red))); 

Существует также вероятность того, что вам нужно изменить фон строк вашей таблицы данных в соответствии с состояниями объектов данных за ними. В этом случае вы можете установить собственный стиль с триггерами в xaml и назначить ему стиль строки. Я думаю, что-то вроде этого:

<Window.Resources>
    <Style x:Key="customDataGridRowStyle" TargetType="{x:Type DataGridRow}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Test1}" Value="1">
                <Setter Property="Background" Value="Red"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
..
<DataGrid .. DataGrid.RowStyle ="{StaticResource customDataGridRowStyle}" >
..

в приведенном выше примере красный фон устанавливается на строку, когда его свойство "Test1" получает значение "1"

надеюсь, это поможет, с уважением

0 голосов
/ 12 января 2010

Строки, которые не видны на экране, не могут быть окрашены с помощью этого метода, поскольку они виртуализированы и фактически не существуют. В приведенном ниже стиле im привязка к свойству IsRed, чтобы превратить строки между красным и их цвет по умолчанию (поместите это в ресурсы from с сеткой данных на нем)

        <Style
           TargetType="{x:Type dg:DataGridRow}"
           BasedOn="{StaticResource {x:Type dg:DataGridRow}}">
           <Style.Triggers>
              <DataTrigger
                 Binding="{Binding ElementName=self, Path=IsRed}"
                 Value="True">
                 <Setter
                    Property="Background"
                    Value="Red" />
              </DataTrigger>
           </Style.Triggers>
        </Style>

У меня есть свойство зависимости в моей форме, называемое IsRed, это также может быть любое свойство, которое реализует INotifyPropertyChanged (свойства зависимости уведомляют об их изменениях)

  public Boolean IsRed {
     get { return (Boolean)GetValue(IsRedProperty); }
     set { SetValue(IsRedProperty, value); }
  }

  // Using a DependencyProperty as the backing store for IsRed.  This enables animation, styling, binding, etc...
  public static readonly DependencyProperty IsRedProperty =
      DependencyProperty.Register("IsRed", typeof(Boolean), typeof(Window1), new UIPropertyMetadata(false));

тогда в моем xaml у меня есть объявление вверху

<Window
   x:Class="Grids.Window1"
   x:Name="self">

, что означает, что я могу ссылаться на него с привязкой имени элемента (метод, который я считаю полезным)

С указанным выше кодом все, что вам нужно будет сделать при нажатии кнопки, будет

  private void Button_Click(object sender, RoutedEventArgs e) {
     IsRed = !IsRed;
  }
...