2017-06-13 1 views
0

Ich wollte die Farbe der gesamten Reihe, aber row is null mit meinem aktuellen Code ändern. datagrid.Rows existiert nicht.Farbe ändert von Datagrid

Ich möchte zum Beispiel die 3 RD Zeile hervorheben.

var row = datagrid.ItemContainerGenerator.ContainerFromItem(3) as Microsoft.Windows.Controls.DataGridRow; 
row.Background = Brushes.Blue; 
+0

Das ist WPF, oder? –

+0

ja, es ist ....... –

+0

Hängt die Hintergrundfarbe von einer Eigenschaft oder etwas anderem ab? Sie könnten es mit Stilen ausprobieren. –

Antwort

0

versuchen, etwas wie folgt aus:

<DataGrid.RowStyle> 
    <Style TargetType="DataGridRow"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Executed}" Value="False"> 
         <Setter Property="Background" Value="LightCoral" /> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding Executed}" Value="True"> 
         <Setter Property="Background" Value="LightGreen" /> 
       </DataTrigger> 
      </Style.Triggers>  
    </Style> 
</DataGrid.RowStyle> 

In diesem Fall habe ich Caliburn micro bin mit der Hintergrundfarbe zu binden, auf einem Bool in meiner Reihe abhängig (verwendet Bool weiß bleiben, bis Bool geändert wird?).

+0

und wie trigger ich die Farbänderung? Im Code. –

+0

Durch Setzen der Bool auf entweder falsch oder wahr. 'private bool _executed; public bool Ausgeführt { get => _executed; set { _executed = Wert; NotifyOfPropertyChange(); } ' Dies ist, wie Sie es aus dem Viewmodel tun Caliburn micro verwenden. Das Setzen der ausgeführten wird die Ansicht –

0

Das ist nicht wirklich der beste Weg ist, den Hintergrund eines DataGridRow zu ändern - Sie Style von @ David Danielewicz wie vorgeschlagen verwenden sollten - aber für den aktuellen Ansatz zu arbeiten, sollten Sie das Objekt geworfen, das von dem Verfahren zu einem System .Windows.Controls.DataGridRow.

Sie sollten auch die ContainerFromIndex Methode verwenden, um einen Verweis auf den visuellen Behälter für das vierte Element zu erhalten. Das dritte Element hat einen Index von 2.

Try this:

var row = datagrid.ItemContainerGenerator.ContainerFromIndex(2) as System.Windows.Controls.DataGridRow; 
row.Background = Brushes.Blue; 

auch beachten, dass dies funktioniert, müssen Sie warten, bis die Behälter tatsächlich geschaffen:

datagrid.Loaded += (ss, ee) => 
{ 
    var row = datagrid.ItemContainerGenerator.ContainerFromIndex(2) as System.Windows.Controls.DataGridRow; 
    row.Background = Brushes.Blue; 
}; 
+0

gleiche Sache aktualisieren. row = null –

+0

Wohin führen Sie diesen Code tatsächlich aus? Sie müssen warten, bis die Container tatsächlich erstellt wurden. – mm8

+0

Nun, es heißt, es ist null, aber der Code stürzt nicht ab. Wenn ich 'steps.ItemContainerGenerator 'überprüfe, kann ich alle Elemente sehen. Also bin ich mir ziemlich sicher, dass es die Daten von der Tabelle bekommt. –

0

Der Zugriff auf die Ansicht von Code hinten ist eine schlechte Übung. Verwenden Sie besser die Leistung von MVVM:

<Window> 
    <Window.Resources> 
     <ResourceDictionary> 
      <Style x:Key="DataGridRowStyle" TargetType="DataGridRow"> 
       <Setter Property="Background" Value="{Binding RowBackground}"/> 
      </Style> 
     </ResourceDictionary> 
    </Window.Resources> 
    <DataGrid ItemsSource="{Binding Records}" RowStyle="{StaticResource DataGridRowStyle}" AutoGenerateColumns="False" CanUserAddRows="False">   
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Value}" Width="*"/> 
     </DataGrid.Columns> 
    </DataGrid>  
</Window> 

public MainWindow() 
{ 
    InitializeComponent(); 
    DataContext = new MainWindowViewModel(); 
} 

public class MainWindowViewModel 
{ 
    public MainWindowViewModel() 
    { 
     Records.Add(new RecordViewModel() 
     { 
      Value = "Red", 
      RowBackground = new SolidColorBrush(Colors.LightCoral) 
     }); 

     Records.Add(new RecordViewModel() 
     { 
      Value = "Green", 
      RowBackground = new SolidColorBrush(Colors.LightGreen) 
     }); 

     Records.Add(new RecordViewModel() 
     { 
      Value = "Blue", 
      RowBackground = new SolidColorBrush(Colors.LightBlue) 
     }); 

     Records[2].Value = "Not blue anymore"; 
     Records[2].RowBackground = new SolidColorBrush(Colors.LightPink); 
    } 

    public ObservableCollection<RecordViewModel> Records { get; } = new ObservableCollection<RecordViewModel>(); 
} 

public class RecordViewModel : INotifyPropertyChanged 
{ 
    private string _value; 
    private Brush _rowBG; 
    public event PropertyChangedEventHandler PropertyChanged; 

    public string Value 
    { 
     get 
     { 
      return _value; 
     } 
     set 
     { 
      _value = value; 
      OnPropertyChanged(nameof(Value)); 
     } 
    } 

    public Brush RowBackground 
    { 
     get 
     { 
      return _rowBG; 
     } 
     set 
     { 
      _rowBG = value; 
      OnPropertyChanged(nameof(RowBackground)); 
     } 
    } 

    private void OnPropertyChanged(string name) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); 
    } 
} 
Verwandte Themen