2017-09-30 9 views
0

私はデータグリッドを使用しており、その条件に従って行の色を変更しています。これをプログラムで実行しています。私のデータグリッドがデータテーブルにバインドされているよう は、私はそれが近づいする最善の方法ではないにもかかわらず、私のグリッドの色を更新することができ、私はこれでデータテーブルWPFを使用してDataGridカラーを変更する際の問題C#

private void UpdateCor() { 

gvDados.UpdateLayout(); 
for (int i = 0; i <dt.Rows.Count; i ++) 
{ 
     var rowContext = (DataGridRow) 
     gvDados.ItemContainerGenerator.ContainerFromIndex (i); 

      if (rowContext! = null) 
      { 
            if (dt.Rows [i] ["situation"]. ToString(). Equals (1)) 
                     rowContext.Background = Brushes.Green; 
            else 
                     rowContext.Background = Brushes.Red; 
      } 
    } 
} 

から直接情報をロードする例 に従ってください。私の問題はこれです、私がスクロールバーを下に動かしたり、バーの上に行くと、色が古くなってしまいます。これを防ぐ方法を教えてください。バーを回転させても、色は固定されたままです。

+1

これは仮想化によるものです。あなたがしようとしていることは非常に悪い考えです。仕事を正しくするのはおそらく不可能でしょう。スタイルとトリガーでXAMLでこれを行う必要があります。スタックオーバーフローには多くの例があります。しかしGoogleを使って検索する。ここの検索機能はあまり良くありません。 –

+0

このリンク:[datatrigger on enum to image](https://stackoverflow.com/questions/13917033/datatrigger-on-enum-to-change-image)が役立ちます。おそらく背景色にセッターが必要です –

答えて

1

これは、this questionと同様の質問です。 はdatatriggerを使用して行うことができます。

しばしば
<DataGrid ItemsSource="{Binding YourItemsSource}"> 
     <DataGrid.RowStyle> 
      <Style TargetType="DataGridRow"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding State}" Value="State1"> 
         <Setter Property="Background" Value="Red"></Setter> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding State}" Value="State2"> 
         <Setter Property="Background" Value="Green"></Setter> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </DataGrid.RowStyle> 
    </DataGrid> 
1

、XAMLは、より複雑な条件を表現するにはあまりにも簡単です。私は値がどの色をコンバーターに使うべきかというロジックを置くことを好みます。これにより、XAMLがよりシンプルになり、C#のコンバータの柔軟性が大幅に向上します。 C#ので

<datagrid.rowstyle> 
    <style targettype="DataGridRow"> 
    <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, 
     Path=Item.situation, Converter={StaticResource ValueToBackgroundConverter}}"/> 
    </style> 
</datagrid.rowstyle> 

:WPFデータグリッドのさまざまな部分をフォーマット

class ValueToBackgroundConverter: IValueConverter { 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { 
    if (value is int) { 
     int quantity = (int)value; 
     if (quantity>=100) return Brushes.White; 
     if (quantity>=10) return Brushes.WhiteSmoke; 
     if (quantity>=0) return Brushes.LightGray; 
     return Brushes.White; //quantity should not be below 0 
    } 
    //value is not an integer. Do not throw an exception 
    // in the converter, but return something that is obviously wrong 
    return Brushes.Yellow; 
    } 

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

は難しいことで知らあるとMicrosoftがどのようにそれを行うために必要な情報を提供していません。私の記事Codeproject: Guide to WPF DataGrid formatting using bindingを読んで、簡単に理解する方法を理解してください。

関連する問題