2015-01-28 2 views
0

Например, в XAML У меня есть DataGrid с именем PersonList:Как изменить цвет фона определенной строки в DataGrid

<DataGrid Name="PersonList" /> 

В коде у меня есть коллекция Person:

ObservableCollection<Person> persons = ViewModel.PersonModel; 

и тогда я создал Person DataTable и переплетены его к PersonList следующим образом:

PersonDataTable.Columns.Add("Name", typeof(string)); 
PersonDataTable.Columns.Add("Age", typeof(int)); 

foreach (var person in persons) 
{ 
    if (person != null) 
    { 
     PersonDataTable.Rows.Add(
      Person.Name, 
      Person.Age 
      ); 
    } 
} 
PersonList.ItemSource = PersonDataTable.AsDataView; 

Мой вопрос есть, как изменить цвет фона определенной строки? Например, изменить цвет фона строки с возрастом человека> 50

Я пытался сделать это путем доступа к каждой строке из PersonList.ItemSource, но мне не удалось, и строка всегда нуль:

int count = 0; 
foreach (var person in PersonList.ItemSource) 
{ 
    var row = PersonList.ItemContainerGenerator.ContainerFromItem(person) as DataGridRow; 
    if (PersonDataTable.Rows[count].Field<int>(1) > 50) 
    { 
     row.Background = Brushes.Gray; 
    } 
    count++; 
} 

Помогите, мастера WPF :)

ответ

1

Попробуйте логику с помощью преобразователя, как показано ниже:

Вот мой AgeAboveLimitConverter файл:

using System; 
using System.Windows.Data; 

namespace DataGridSample.Converter 
{ 
    public class AgeAboveLimitConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      if (value != null) 
      { 
       return (int)value > 50; 
      } 

      return false; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      return null; 
     } 
    } 
} 

А затем в файле XAML DataGrid, добавить пространство имен xmlns:converter="clr-namespace:DataGridSample.Converter"

Добавить стиль для DataGridRow в DataGrid,

<Grid> 
     <Grid.Resources> 
      <converter:AgeAboveLimitConverter x:Key="AgeConverter"/> 
     </Grid.Resources> 
     <DataGrid Name="PersonList"> 
      <DataGrid.RowStyle> 
       <Style TargetType="DataGridRow" > 
        <Setter Property="Background" Value="Transparent" /> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Path=Age,Converter={StaticResource AgeConverter}}" Value="true"> 
          <Setter Property="Background" Value="Red"/> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </DataGrid.RowStyle> 
     </DataGrid> 
    </Grid> 
0

Вы были почти там. Попробуйте следующее:

int count = 0; 
foreach (var person in PersonList.ItemSource) 
{ 
    var row = PersonList.ItemContainerGenerator.ContainerFromItem(person) as DataGridRow; 
    if (PersonDataTable.Rows[count].Field<int>(1) > 50) 
    { 
     row.DefaultCellStyle.BackColor = Color.Gray; 
    } 
    count++; 
} 
+1

Спасибо, но я использую WPF :(Это не решило мою проблему. – Ingako

+0

Хороший призыв к гранту. Не видел последней строки. [Посмотрите ответ на этот вопрос о том, как настроить DataTrigger] (http://stackoverflow.com/questions/18053281/how-to-set-datagrids-row-background-based-on-a-property-value- использование-данные бинди). Должно быть то, что вы ищете. –

+0

Спасибо! Наконец, это заставило его работать ... Я думал, что так близко, чтобы он работал на моем пути: P – Ingako

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