2011-04-30 8 views
1

データグリッドにいくつかのセルがあり、その値が0のときに特定の列のセルをハイライトしたいと思います。これにどう対処するかはわかりません。DataGridCellの値に基づくトリガー

私はこの質問を見ました:WPF: How to highlight all the cells of a DataGrid meeting a condition?しかし、私の解決策はありませんでした。

スタイルトリガーを使用すると、トリガーはプロパティに適用されるように見えます。私は何も起こらないようなことをするとき(単純な値よりも内容が多いので、私は推測している)私はこれを達成することができますどのようにCustom binding class is not working correctly

任意のアイデア:私は今しばらくVSにされていますバグの症状と思われたコンパイル時の問題を得ていた最後の提案された解決策では

誰もが考えている?

答えて

1

DataGridCellの値に基づいてセルの背景色を変更する最も良い方法は、セルの背景色を変更するためにConverterでDataGridTemplateColumnのDataTemplateを定義することです。ここで提供されるサンプルはMVVMを使用します。

キー部分は、次の例に検索するには、次のとおり

1:色モデルの整数(因子)に変換XAML:

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

2:A戻りコンバータモデルの整数プロパティに基づいたSolidColorBrush:

public class ObjectToBackgroundConverter : IValueConverter 

3:ボタンから0と1の間でモデルの整数値を変更ViewModelには、イベントを発生しますコンバーターの色が変わります。

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

4:モデルはINotifyPropertyChangedのは、私が使用されるコア部分を除いて私の答えに、ここで必要なすべてのビットを提供してきました

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

をOnPropertyChangedを呼び出すことにより、背景色を変更するイベントを発生するために使用実装 として、ViewModelBase(INotifyPropertyChanged)とGoogle経由で見つけることができるDelegateCommandを含むMVVMパターンの基礎となります。 ViewのDataContextをコードビハインドのコンストラクタの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) 
           }); 
    } 
    } 
} 
関連する問題