12

行の背景色が交互に変わるデータ バインドされた DataGrid があります。セルに含まれるデータに基づいてセルに異なる色を付けたいと思います。このスレッドで提案された解決策を試しました

http://wpf.codeplex.com/Thread/View.aspx?ThreadId=51143

しかし、

DataGridCellsPresenter プレゼンター = GetVisualChild(row)

常に null を返します。

私は使っている

    public static T GetVisualChild<T>(Visual parent) where T : Visual
    {
        T child = default(T);
        int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
        for (int i = 0; i < numVisuals; i++)
        {
            Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
            child = v as T;
            if (child == null)
            {
                child = GetVisualChild<T>(v);
            }
            if (child != null)
            {
                break;
            }
        }
        return child;
    }

しかし、DataGridRow の VisualTreeHelper.GetChildrenCount() は常に 0 を返します。DataGridRow が null ではなく、既にデータが取り込まれていることを確認しました。どんな助けでも大歓迎です。

ありがとう。

4

2 に答える 2

13

アクセスしたいセルの行とインデックスがわかっている場合、コードでそれを行う方法は次のとおりです。

//here's usage
var cell = myDataGrid.GetCell(row, columnIndex);
if(cell != null)
    cell.Background = Brushes.Green;

データグリッド拡張機能:

public static class DataGridExtensions
{
    public static DataGridCell GetCell(this DataGrid grid,  DataGridRow row, int columnIndex = 0)
    {
        if (row == null) return null;

        var presenter = row.FindVisualChild<DataGridCellsPresenter>();
        if (presenter == null) return null;

        var cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex);
        if (cell != null) return cell;

        // now try to bring into view and retreive the cell
        grid.ScrollIntoView(row, grid.Columns[columnIndex]);
        cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex);

        return cell;
    }
于 2014-01-22T22:33:07.037 に答える
7

まず最初に、コード ビハインドでこれを行わないでください。このやり方でフレームワークと戦っています。WPF の設計は異なります。フレームワークがどのように物事を行うことを望んでいるかという観点から考える必要があります。WPF の場合は、XAML マークアップ + コンバーター クラスです。

目的を達成するには、次の 2 つのことが必要です。

  • DataGrid のスタイルを設定するための適切な XAML マークアップ
  • テキストの値を適切なハイライト色に変換する IValueConverter 実装。

ここに行きます:

データグリッドの XAML

最初に、DataGrid セルのスタイルを設定するために必要な XAML を定義します。次のようになります。

<toolkit:DataGrid.CellStyle>
      <Style TargetType="{x:Type toolkit:DataGridCell}">
        <Style.Setters>
          <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Path=Content.Text, Converter={StaticResource dataGridCellConverter}}" />
        </Style.Setters>
      </Style>
    </toolkit:DataGrid.CellStyle>

これは、RelativeSource (DataGridCell) へのバインディングを設定し、セルの Content.Text を値として使用して Converter (dataGridCellConverter) に渡すように指示することです。

IValueConverter

次に必要なのは、セルのテキストに基づいて実際に色を決定するための IValueConverter の実装です。

using System;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Media;
namespace UserControls.Utility.Converters
{
  public class DataGridCellConverter : IValueConverter
  {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
      if (value == null) return Colors.White.ToString();

      if (value.ToString().ToUpper().Contains("CMS")) return "LIME";

      return "ORANGE";
    }

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

ここでは、「CMS」というテキストを探して、背景セルに色を付けています。「CMS」が存在しない場合は、代わりにオレンジ色を返します。

リソースの指定

ここで、ウィンドウ/ユーザー コントロールにマークアップを追加して、コンバーターを適切なリソースとして指定する必要があります。

<UserControl.Resources>
    <Converters:DataGridCellConverter x:Key="dataGridCellConverter"/>
</UserControl.Resources>

そして、それはそれを行う必要があります! 幸運を。

于 2010-09-09T12:16:46.820 に答える