2013-12-09 4 views
0

У меня есть DataGrid и вам нужно установить отдельные цвета фона на некоторых ячейках и изменить цвет ячейки при выборе. Изменение цвета при выборе хорошо работает, и если вы пытаетесь установить цвет фона без привязки, это тоже работает. Я предполагаю, что мое обязательство неверно.привязка цвета фона ячейки Datagrid

Поэтому я использовал этот код в XAML

<Style TargetType="{x:Type DataGridCell}" x:Key="NumberCell"> 

     <Style.Setters> 
      <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource FindAncestor},Path=StatusColor}"></Setter> 
     </Style.Setters> 
     <Style.Triggers> 
      <Trigger Property="DataGridCell.IsSelected" Value="True" > 
       <Setter Property="Background" Value="{StaticResource LoudBrush}" /> 
       <Setter Property="BorderBrush" Value="{StaticResource LoudBrush}" /> 
       <Setter Property="VerticalContentAlignment" Value="Center" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

мой код для заполнения DataGrid:

private void AddColumns(DataGrid dataGrid, IEnumerable<User> Users) 
    { 


     var columnsAmount = dataGrid.Columns.Count; 
     if(columnsAmount > 1) 
     { 
      var dayColumnKepper = dataGrid.Columns[0]; 
      dataGrid.Columns.Clear(); 
      dataGrid.Columns.Insert(0, dayColumnKepper); 
     } 

     foreach(var user in Users) 
     { 
      var column = new DataGridTextColumn(); 
      column.Binding = new Binding(string.Format("UserWorkplan[{0}].Appointment.Type", user.Id)); 
      column.Header = user.Username; 
      column.CellStyle = (Style)Resources["NumberCell"]; 
      dataGrid.Columns.Insert(1, column); 
     } 
    } 

public IDictionary<int, CalenderWorkplanEntry> UserWorkplan { get; set; } 

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

public class CalenderWorkplanEntry 
{ 

    public string Fullname { get; set; } 
    public int UserId { get; set; } 
    public string StatusColor { get; set; } 
    public WorkPlanAppointment Appointment { get; set; } 

} 

ответ

1

Первые вещи первые ... Пожалуйста, сделайте себе одолжение и сделать не манипулировать объектами пользовательского интерфейса в коде позади. Правильный способом связать с элементом управления сбором является реализацией интерфейса INotifyPropertyChanged, определяет общественную ObservableCollection<T> собственности и данные привязать его к DataGrid.ItemsSource собственности:

<DataGrid ItemsSource="{Binding Items}" /> 

Далее, чтобы избавиться от цвета выбора по умолчанию, добавьте это в вашем Resources разделе:

<DataGrid.Resources> 
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" /> 
    <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" /> 
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" /> 
    <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Black" /> 
</DataGrid.Resources> 

Вы можете играть с этими цветами, чтобы удовлетворить ваши требования, или просто оставить их как Transparent так, что они не скрывают свои Trigger цвета.

Пожалуйста, дайте мне знать, если я неправильно понял вашу проблему.

+0

триггер работает хорошо, но в следующий раз я буду использовать ваш подход. Я считаю, что моя проблема в этой строке: . Я содержит цвет каждой строки, но каждый раз, когда отображается цвет по умолчанию. – Arne

+0

Да, это 'Binding' недействительно ... к чему вы пытаетесь привязаться? – Sheridan

+0

в CalenderWorkplanEntry имеет строку StatusColor, и я хочу привязать StatusColor к style.setter. – Arne

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