2012-01-06 4 views
0

Я могу изменить фон Datacell через следующий код C# -Изменение фона DataGrid ячейки

private void Retrieve_rows(object item) 
    { 
     DataRow row = mygrid.GetContainerFromItem(item) as DataGrid.DataRow; 

     if (row != null) 
     { 
      SolidColorBrush redColor = new SolidColorBrush (Colors.Red); 

      foreach (DataGrid.DataCell cell in row.Cells) 
      { 
       var dc = ((System.Windows.FrameworkElement)(((DataGrid.Cell)(cell)).ParentRow)).DataContext; 

       // get my custom object and change color if IsBlank value is set to true 
       MyRowObject rowObject = dc as MyRowObject; 

       for (int counter = 0; counter < rowObject.values.Count; counter++) 
       { 
         if (rowObject.values[counter].IsBlank == true) 
          row.Cells[counter].Background = redColor; 
        } 
       } 
       return; 
      } 
     } 
    } 

Но с этим кодом, производительность приложений деградирует в значительной степени. Есть ли способ конвертировать выше код в триггеры XAML/или любой другой способ повысить производительность сетки.

ответ

0

Добро пожаловать в мир WPF;)

Вы можете попробовать это:

<DataGrid Name="myGrid"> 
    <DataGrid.Columns> 
    <DataGridTextColumn Header="Col1" Binding="{Binding Col1}" /> 
    <DataGridTextColumn Header="Col2" Binding="{Binding Col2}" /> 
    </DataGrid.Columns> 
<DataGrid.CellStyle> 
    <Style TargetType="{x:Type DataGridCell}"> 
    <Setter Property="Background" Value="Red" /> 
    </Style> 
    </DataGrid.CellStyle> 
</DataGrid> 

Cheers,

Sebi

+0

Привет, Себи, спасибо за ответ. но я уже пробовал использовать код xaml, который не работает. <Условие Binding = "{Связывание RelativeSource = {RelativeSource Self}, Path = Имя поля}" Значение = "значение" /><Условие Binding = "{Binding IsBlank}" Value = "true"/><Свойство Setter = "Background" Value = "Red" /> user1134489

+1

, пожалуйста, будьте более конкретными - что вы собираетесь делать с этим мультитатриграгером? кажется немного от темы ... –

0

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

<Rectangle Grid.Column="1" Grid.Row="1" Fill="Red"></Rectangle> 
    <TextBox Grid.Column="1" Grid.Row="1" Background="Transparent" Text="test"></TextBox> 
3

Так как вам нужно два динамических значения, чтобы определить цвет фона ячейки (ColumnIndex и ValuesList), вам нужно использовать MultiConverter, который принимает эти два значения и возвращает цвет.

Например,

if ValueList[ColumnIndex].IsBlank) 
    Return Colors.Red; // Might be Brushes.Red too, can't remember 
else 
    Return Colors.White; 

Триггер может быть применен ко всем неявно DataGridCells со стилем, который не имеет ключа указанный

<Style TargetType="{x:Type DataGridCell}"> 
    <Setter Property="Background"> 
     <Setter.Value> 
      <MultiBinding Converter="{StaticResource MyMultiConverter}"> 
       <Binding Path="Column.DisplayIndex" RelativeSource="{RelativeSource Self}" /> 
       <Binding Path="ValueList" /> 
      </MultiBinding> 
     </Setter.Value> 
    </Setter> 
</Style> 

я мог бы иметь RelativeSource синтаксис неправильно в Column.DisplayIndex связывание MultiBinding, однако связывание должно указывать на Self, то есть DataGridCell

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