8

ObserverableCollectionで満たされたWPFデータグリッドがあります。

ここで、プログラムの開始時の行の内容と、実行時に何かが変更されたかどうかに応じて、行に色を付けたいと思います。

System.Windows.Controls.DataGrid areaDataGrid = ...;
ObservableCollection<Area> areas;
//adding items to areas collection
areaDataGrid.ItemsSource = areas;

areaDataGrid.Rows  <-- Property not available. how to access rows here?

CollectionView myCollectionView = (CollectionView)CollectionViewSource.GetDefaultView(areaDataGrid.Items);
((INotifyCollectionChanged)myCollectionView).CollectionChanged += new NotifyCollectionChangedEventHandler(areaDataGrid_Changed);
...

void areaDataGrid_Changed(object sender, NotifyCollectionChangedEventArgs e)
{
    //how to access changed row here?
}

開始時と実行時に行にアクセスするにはどうすればよいですか?

4

2 に答える 2

12

を使用しRowStyleます。を使用しTriggersて条件付きで色を変更するか、アイテムのプロパティにバインドしてBrushそのプロパティをそれぞれ変更することができます。

于 2012-04-07T17:29:50.077 に答える
7

トリガーではなくコードで変更すると、次のようになります。データに配列としてアクセスし、比較することができます。この例では、4番目の列を比較して0より大きいかどうかを確認し、5番目の列を比較して0より小さいかどうかを確認します。それ以外の場合は、デフォルトの色でペイントします。有効な行であるかどうかを確認するためにいくつかのロジックを追加する必要があるため、試してみてください。または、以下のようにエラーを無視することもできますが(実際には良い習慣ではありません)、そのまま使用できるはずです。 。

    private void DataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
    {
        try
        {
            if (Convert.ToDouble(((System.Data.DataRowView)(e.Row.DataContext)).Row.ItemArray[3].ToString()) > 0)
            {
                e.Row.Background = new SolidColorBrush(Colors.Green);
            }
            else if (Convert.ToDouble(((System.Data.DataRowView)(e.Row.DataContext)).Row.ItemArray[4].ToString()) < 0)
            {
                e.Row.Background = new SolidColorBrush(Colors.Red);
            }
            else
            {
                e.Row.Background = new SolidColorBrush(Colors.WhiteSmoke);
            }
        }
        catch
        {
        } 
    }
于 2012-11-30T04:14:09.510 に答える