Я хотел покрасить свои строки в зависимости от значений их свойств, и я перепробовал много событий (DataGrid.Initialized
, DataContextChanged
, AddingNewItem
, RowLoaded
и т. Д.) Наряду с вещью BeginInvoke
, но ничего не получалось. Тогда я нашел:
Loaded
Это событие сработало, так как оно позволило мне перебирать строки и раскрашивать их, как я хотел.
private void SubjectsList_Loaded(object sender, RoutedEventArgs e)
{
Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() => ColorMyRows()));
}
CollorMyRows
выглядит очень похоже на их:
private void ColorMyRows()
{
DataGridRow row = null;
for (int i = 0; i < SubjectsList.Items.Count; i++)
{
// get one row
row = SubjectsList.ItemContainerGenerator.ContainerFromIndex(i) as DataGridRow;
if (myConditionIsFulfilled)
{
row.Background = Brushes.PaleGoldenrod; // black'n gold baby
row.ToolTip = "This item fulfills the condition.";
}
else
{
row.Background = Brushes.PaleGreen;
row.ToolTip = "This item does not.";
}
}
}
Примечание : Если у вас ObservableCollection
, связанный с DataGrid
, индекс в цикле (индекс строки DataGrid
) будет соответствовать индексу в коллекции: )