2011-04-30 3 views
1

У меня есть некоторые ячейки в datagrid, и я хотел бы выделить ячейки в некоторых столбцах красного цвета, когда их значение равно 0. Я не уверен, как подойти к этому.Триггер, основанный на значении DataGridCell

Я рассмотрел этот вопрос: WPF: How to highlight all the cells of a DataGrid meeting a condition?, но ни одно из решений для меня не работало.

С помощью триггеров стиля кажется, что триггеры предназначены для применения к свойствам. Когда я делаю что-то вроде ничего не происходит (я предполагаю, потому что для контента больше, чем простое значение).

С последнего предложенного решения я получал во время компиляции вопрос, который, казалось проявлением ошибки, которая была в VS на некоторое время теперь: Custom binding class is not working correctly

Любые идеи, как я могу добиться этого?

У кого-нибудь есть идеи?

ответ

1

Лучший способ изменить цвет фона ячейки на основе значения DataGridCell - определить DataTemplate для DataGridTemplateColumn с конвертером, чтобы изменить цвет фона ячейки. В представленном здесь примере используется MVVM.

Клавиша часть для поиска в следующем примере, включает:

1: XAML, который преобразует целое число (фактор) в модели к цвету:

<TextBlock Text="{Binding Path=FirstName}" 
      Background="{Binding Path=Factor, 
      Converter={StaticResource objectConvter}}" /> 

2: конвертер, который возвращает SolidColorBrush на основе целого свойства в модели:

public class ObjectToBackgroundConverter : IValueConverter 

3: ViewModel, который изменяет целое значение в модели между 0 и 1 с помощью кнопки мыши, чтобы стрелять событие который меняет цвет в конвертере.

private void OnChangeFactor(object obj) 
{ 
    foreach (var customer in Customers) 
    { 
    if (customer.Factor != 0) 
    { 
     customer.Factor = 0; 
    } 
    else 
    { 
     customer.Factor = 1; 
    } 
    } 
} 

4: Модель реализует INotifyPropertyChanged используется для стрельбы события, чтобы изменить цвет фона с помощью вызова OnPropertyChanged

private int _factor = 0; 
public int Factor 
{ 
    get { return _factor; } 
    set 
    { 
    _factor = value; 
    OnPropertyChanged("Factor"); 
    } 
} 

Я условие, что все бит, необходимых здесь, в моем ответе за исключением основных частей, используемым как основой шаблона MVVM, который включает ViewModelBase (INotifyPropertyChanged) и DelegateCommand, который вы можете найти через Google. Обратите внимание, что я привязываю DataContext View к ViewModel в конструкторе кода. Я могу отправить эти дополнительные биты, если это необходимо.

Вот XAML:

<Window x:Class="DatagridCellsChangeColor.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:Helpers="clr-namespace:DatagridCellsChangeColor.Converter" 
    Title="MainWindow" 
    Height="350" Width="525"> 
    <Window.Resources> 
    <Helpers:ObjectToBackgroundConverter x:Key="objectConvter"/> 
    /Window.Resources> 
<Grid> 
    <Grid.RowDefinitions> 
    <RowDefinition Height="Auto"/> 
    <RowDefinition/> 
    </Grid.RowDefinitions> 
    <Button Content="Change Factor" Command="{Binding Path=ChangeFactor}"/> 
    <DataGrid 
    Grid.Row="1" 
    Grid.Column="0" 
    Background="Transparent" 
    ItemsSource="{Binding Customers}" 
    IsReadOnly="True" 
    AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
    <DataGridTemplateColumn 
     Header="First Name" 
     Width="SizeToHeader"> 
     <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Path=FirstName}" 
         Background="{Binding Path=Factor, 
         Converter={StaticResource objectConvter}}" /> 
     </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 
    <DataGridTemplateColumn 
     Header="Last Name" 
     Width="SizeToHeader"> 
     <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding Path=LastName}" /> 
     </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 
    </DataGrid.Columns> 
    </DataGrid> 
</Grid> 
</Window> 

Вот конвертер:

using System; 
using System.Drawing; 
using System.Globalization; 
using System.Windows.Data; 
using System.Windows.Media; 
using Brushes = System.Windows.Media.Brushes; 

namespace DatagridCellsChangeColor.Converter 
{ 
    [ValueConversion(typeof(object), typeof(SolidBrush))] 
    public class ObjectToBackgroundConverter : IValueConverter 
    { 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     int c = (int)value; 

     SolidColorBrush b; 
     if (c == 0) 
     { 
     b = Brushes.Gold; 
     } 
     else 
     { 
     b = Brushes.Green; 
     } 
     return b; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
    } 
} 

Вот это ViewModel:

using System.Collections.ObjectModel; 
using System.Windows.Input; 
using DatagridCellsChangeColor.Commands; 
using DatagridCellsChangeColor.Model; 

namespace DatagridCellsChangeColor.ViewModel 
{ 
    public class MainViewModel : ViewModelBase 
    { 
    public MainViewModel() 
    { 
     ChangeFactor = new DelegateCommand<object>(OnChangeFactor, CanChangeFactor); 
    } 

    private ObservableCollection<Customer> _customers = Customer.GetSampleCustomerList(); 
    public ObservableCollection<Customer> Customers 
    { 
     get 
     { 
     return _customers; 
     } 
    } 

    public ICommand ChangeFactor { get; set; } 
    private void OnChangeFactor(object obj) 
    { 
     foreach (var customer in Customers) 
     { 
     if (customer.Factor != 0) 
     { 
      customer.Factor = 0; 
     } 
     else 
     { 
      customer.Factor = 1; 
     } 
     } 
    } 

    private bool CanChangeFactor(object obj) 
    { 
     return true; 
    } 
    } 
} 

Вот Модель:

using System; 
using System.Collections.ObjectModel; 
using DatagridCellsChangeColor.ViewModel; 

namespace DatagridCellsChangeColor.Model 
{ 
    public class Customer : ViewModelBase 
    { 
    public Customer(String first, string middle, String last, int factor) 
    { 
     this.FirstName = first; 
     this.MiddleName = last; 
     this.LastName = last; 
     this.Factor = factor; 
    } 

    public String FirstName { get; set; } 
    public String MiddleName { get; set; } 
    public String LastName { get; set; } 

    private int _factor = 0; 
    public int Factor 
    { 
     get { return _factor; } 
     set 
     { 
     _factor = value; 
     OnPropertyChanged("Factor"); 
     } 
    } 

    public static ObservableCollection<Customer> GetSampleCustomerList() 
    { 
     return new ObservableCollection<Customer>(new Customer[4] 
           { 
           new Customer("Larry", "A", "Zero", 0), 
           new Customer("Bob", "B", "One", 1), 
           new Customer("Jenny", "C", "Two", 0), 
           new Customer("Lucy", "D", "THree", 2) 
           }); 
    } 
    } 
}