2

DataGridループを使用して行を1つずつ赤で色付けできるWPFプログラムを作成していますが、for奇妙なことに遭遇しました。DataGridにデータベース テーブルのデータが 40 行を超える場合、すべての行が色分けされるわけではありません。

これが私が使用しているコードです。

private void Red_Click(object sender, RoutedEventArgs e)
{
    for (int i = 0; i < dataGrid1.Items.Count; i++)
    {
        DataGridRow row = (DataGridRow)dataGrid1.ItemContainerGenerator.ContainerFromIndex(i);
        if (row != null)
        {
            row.Background = Brushes.Red;
        }
    }
}

他の方法で行を 1 つずつ色付けする他の方法はありますか、またはこれは wpftoolkit の何らかの障害ですか?

4

3 に答える 3

4

行ごとに色を定義する必要があり、行が表示するアイテムにプロパティがある場合は、ItemsContainerStyle を使用して行の色を設定できます。以下の例では、グリッド内のアイテムに ItemColour というプロパティがあり、背景の行の色を定義します。バインディングは、行から行に含まれるアイテムにバインドします。

 <dg:DataGrid.ItemContainerStyle>
    <Style
       TargetType="{x:Type dg:DataGridRow}"
       BasedOn="{StaticResource {x:Type dg:DataGridRow}}">
       <Setter
          Property="Background"
          Value="{Binding ItemColour}" />
    </Style>
 </dg:DataGrid.ItemContainerStyle>

ただし、ビジネス モデルである可能性があるため、項目にプロパティ ItemColour が必要ない場合があります。ここで、ViewModel が真価を発揮します。ビジネス層をラップする中間層と、いくつかのカスタム ロジックに基づく ItemColour プロパティを定義します。

于 2010-01-12T05:48:03.210 に答える
2

グリッドのすべての行に背景を設定する場合は、新しい行スタイル オブジェクトを定義し、その Background プロパティを設定できます。これにより、すべての行の背景を一度に変更する必要があり、それらを繰り返す必要はありません。次のようにします。

dataGrid1.RowStyle = new Style(typeof(DataGridRow));
dataGrid1.RowStyle.Setters.Add(new Setter(Control.BackgroundProperty, new SolidColorBrush(Colors.Red))); 

また、背後にあるデータ オブジェクトの状態に応じて、データグリッド行の背景を変更する必要がある場合もあります。この場合、xaml でトリガーを使用してカスタム スタイルをセットアップし、それを行スタイルに割り当てることができます。私は次のように推測します:

<Window.Resources>
    <Style x:Key="customDataGridRowStyle" TargetType="{x:Type DataGridRow}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Test1}" Value="1">
                <Setter Property="Background" Value="Red"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
..
<DataGrid .. DataGrid.RowStyle ="{StaticResource customDataGridRowStyle}" >
..

上記の例では、「Test1」プロパティが値「1」を取得するたびに、赤い背景が行に設定されます

これが役に立てば幸いです、よろしく

于 2010-01-12T04:52:02.230 に答える
0

画面に表示されていない行は仮想化されており、実際には存在しないため、この方法を使用して色付けすることはできません。以下のスタイルでは、プロパティ IsRed にバインドして、行を赤とデフォルトの色の間で切り替えます (これを、データグリッドのある from のリソースに入れます)。

        <Style
           TargetType="{x:Type dg:DataGridRow}"
           BasedOn="{StaticResource {x:Type dg:DataGridRow}}">
           <Style.Triggers>
              <DataTrigger
                 Binding="{Binding ElementName=self, Path=IsRed}"
                 Value="True">
                 <Setter
                    Property="Background"
                    Value="Red" />
              </DataTrigger>
           </Style.Triggers>
        </Style>

フォームに IsRed という依存関係プロパティがあります。これは、INotifyPropertyChanged を実装する任意のプロパティにすることもできます (依存関係プロパティは変更を通知します)。

  public Boolean IsRed {
     get { return (Boolean)GetValue(IsRedProperty); }
     set { SetValue(IsRedProperty, value); }
  }

  // Using a DependencyProperty as the backing store for IsRed.  This enables animation, styling, binding, etc...
  public static readonly DependencyProperty IsRedProperty =
      DependencyProperty.Register("IsRed", typeof(Boolean), typeof(Window1), new UIPropertyMetadata(false));

次に、私のxamlでは、上部に宣言があります

<Window
   x:Class="Grids.Window1"
   x:Name="self">

つまり、要素名バインディングで参照できます (便利な手法です)。

コードを概説したように、ボタンをクリックする必要があるのは次のとおりです。

  private void Button_Click(object sender, RoutedEventArgs e) {
     IsRed = !IsRed;
  }
于 2010-01-12T03:00:20.247 に答える