Domanda

Sto facendo un programma WPF che è in grado di colorare le righe in un DataGrid uno per uno in rosso con il ciclo for e ho incontrato qualcosa di strano. Se il DataGrid ha più di 40 righe di dati da una tabella di database, non colorare tutte le righe.

Ecco il codice che sto utilizzando.

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

C'è un altro modo per colorare le file uno per uno attraverso altri metodi o si tratta di una sorta di difetto wpftoolkit?

È stato utile?

Soluzione

Se si desidera definire i colori per ogni riga e si dispone di una proprietà sulle voci delle righe di visualizzazione È possibile utilizzare un ItemsContainerStyle per impostare il colore di riga. Nell'esempio riportato di seguito si avrebbe una proprietà chiamata ItemColour sui tuoi oggetti nella griglia che definirà il colore di sfondo fila. Si lega legame della riga alla voce della riga contiene.

 <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>

Ma non si potrebbe desiderare un ItemColour proprietà sui tuoi oggetti come potrebbero essere il vostro modello di business. Qui è dove un ViewModel entra in proprio. si definisce uno strato intermedio che avvolge il tuo livello di business e la proprietà ItemColour sulla base di una logica personalizzata.

Altri suggerimenti

Se si desidera impostare sfondo a tutte le righe della griglia è possibile definire un nuovo oggetto di stile riga e impostare la sua proprietà di sfondo; questo dovrebbe cambiare tutto sfondo filari tutto in una volta, senza la necessità di scorrere attraverso di loro. Dovrebbe occupare in questo modo:

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

C'è anche una possibilità che è necessario modificare sfondo delle righe di DataGrid in base agli stati degli oggetti dati dietro di loro. In questo caso è possibile impostare uno stile personalizzato con i trigger in XAML e assegnargli il RowStyle. Credo che si dovrebbe occupare in questo modo:

<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}" >
..

nell'esempio sopra sfondo rosso è impostato alla riga ogni volta che è "Test1" proprietà ottiene valore "1"

Spero che questo aiuti, saluti

Le righe che non sono visibili sullo schermo non saranno abili a colorarsi con questo metodo come sono virtualizzati via E non esiste effettivamente. Nello stile di sotto associazione a una proprietà im IsRed di trasformare le righe tra il rosso e il loro colore di default (mettere questo in risorse del dal del datagrid su di esso)

        <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>

ho una proprietà di dipendenza sulla mia forma chiamato IsRed, questo potrebbe anche essere qualsiasi proprietà che implementa INotifyPropertyChanged (proprietà di dipendenza notificare le loro modifiche)

  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));

poi nella mia XAML ho la dichiarazione in alto

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

che significa che posso riferimento con un nome di elemento assorbente (una tecnica utile ho trovato)

Con il codice come ive delineato pulsante tutto il vostro scatto avrebbe dovuto fare sarebbe

  private void Button_Click(object sender, RoutedEventArgs e) {
     IsRed = !IsRed;
  }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top