2010-01-12 3 views
2

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

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

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?

ответ

4

Если вы хотите определить цвета для каждой строки, и у вас есть свойство на элементах, отображаемых в строке, вы можете использовать ItemContainerStyle для установки цвета строки. В приведенном ниже примере у вас будет свойство 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 на основе некоторой пользовательской логики.

+0

Можете ли вы привести пример этой модели ViewModel? Я все еще нехорошо, когда дело доходит до связывания свойств. – KenNY

+1

http://sites.google.com/site/wpfprojects/ загрузите пример цветных строк и отметьте этот вопрос как ответ. там могут быть и другие проекты, которые вам могут понравиться, а также –

+0

+1 для орфографии, окрашенной с помощью «u», о, и спасибо за пример. – Grokodile

0

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

 <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; 
    } 
+0

Я вижу.Если строки не существуют, поскольку они не видны в datagrid, означает ли это, что невозможно покрасить строки более чем одним цветом (например: белый/черный/серый или желтый/красный/синий)? Спасибо за ответ кстати. Я все еще чувствую, что должны быть другие способы решить эту проблему. – KenNY

2

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

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

Существует также вероятность того, что вам нужно изменить фон ваших DataGrid строк по состояниям объектов данных, стоящих за ними. В этом случае вы можете настроить собственный стиль с помощью триггеров в вашем 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»

надеюсь, что это помогает, считает