3

datagridviewがあり、1つの列と他の2つの列の比較結果に応じて、行の背景色を動的に更新しようとしています。私のdatagridviewはデータテーブルにバインドされています。datagridviewの3つの異なる列は、min、max、およびpresentです。min列とmax列の値は静的であり、変更されません。各行の現在の列の値は動的に更新されます。

IValueConverterインターフェイスを実装するMinMaxTesterというクラスを使用して、セルの内容を比較し、ブラシの色を返します。

私が実装したソリューションでは、背景色が更新されることがあることに注意してください。datagridviewは、タブコントロール内のタブアイテムの一部です。datagridviewがユーザーに表示されていない場合、通常、背景色が更新されます。データグリッドビューがユーザーに表示されている場合(つまり、タブコントロール内のタブ項目が選択されている場合)、背景色は更新されません。

行の背景色が常に更新されるように、ソリューションで何を変更する必要があるのでしょうか。

XAMLファイルコード

<Window.Resources>
    <local:MinMaxTester x:Key="MinMaxTester"/>
</Window.Resources>

<DataGrid.Columns>
<DataGridTextColumn Header="Present" Binding="{Binding Present}"/>
<DataGridTextColumn Header="Min" Binding="{Binding Min}"/>
<DataGridTextColumn Header="Max" Binding="{Binding Max}"/>
</DataGrid.Columns>

<DataGrid.RowStyle>
    <Style TargetType="{x:Type DataGridRow}">
         <Setter Property="Background" Value="{Binding Converter={StaticResource MinMaxTester}}"/>
    </Style>
<DataGrid.RowStyle>

実装コード

[ValueConversion(typeof(DataRowView),typeof(Brush))]
public class MinMaxTester: IValueConverter
{
    public object Convert(object datagridrow, Type target, object parameter, System.Globalization.CultureInfo culture)
    {
        int min, max, present;
        DataRowView r = datagridrow as DataRowView;
        min = int.Parse(r["Min"].ToString());
        max = int.Parse(r["Max"].ToString());
        present = int.Parse(r["Present"].ToString());
        if (present >= min && present <= max) 
            return Brushes.Green;
        else
            return Brushes.Red;
    }
    public object ConvertBack(object datagridrow, Type target, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException("Not using the ConvertBack function in  MinMaxTester");

    }
}
4

3 に答える 3

2

これを試しましたか?

<Window.Resources>
        <my:RowBackgroundColorConverter x:Key="rowBackgroundColorConverterResource"></my:RowBackgroundColorConverter>
    </Window.Resources>

   <DataGrid.RowStyle>
                            <Style TargetType="{x:Type DataGridRow}">
                                <Setter Property="Background" Value="{Binding fieldXXX, Converter={StaticResource converterXXX}}"></Setter>
                            </Style>
                        </DataGrid.RowStyle>

そしてコンバーターコード:

using System;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Media;
using System.Windows;
using System.Windows.Controls;

namespace XXX.Converters
{
    public class RowBackgroundColorConverter : IValueConverter
    {
        private readonly Color expiredColor = Colors.Red;

        private readonly Color normalColor = Colors.Gray;

        public object Convert(
            object value,
            Type targetType,
            object parameter,
            CultureInfo culture)
        {

            if (XXXXX)
                return new SolidColorBrush(expiredColor);

                return new SolidColorBrush(normalColor);
        }

        public object ConvertBack(
            object value, 
            Type targetType, 
            object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }
}
于 2014-04-28T10:48:49.587 に答える
1

あなたPresentが何をどこで行っているかはわかりませんが、これは必要に応じて機能する可能性があります(コードをあまり変更しなくても)

<MultiBinding Converter="{StaticResource converter}" Mode="OneWay">
    <MultiBinding.Bindings>
        <Binding Path="Present" />
        <Binding Path="" />
    </MultiBinding.Bindings>
</MultiBinding>

...そして、あなたのコンバーター(今ではIMultiValueConverter- すべて似ていますが、もう1つのフィールドがあります)には、両方の値があります。「行」を使用して計算します。
...そして、直接バインディングを使用しPresentて変更をトリガーします。

また、Present を「保持」しているものは何でも、既に述べたように INotifyPropertyChanged を持っていることを確認する必要があります。

それが役に立てば幸い

于 2013-03-15T17:00:19.653 に答える
0

にバインドしていると言いましたがDataTable、のデータはINotifyPropertyChangedDataTableを実装していないため、UI に更新が必要であることを通知する通知は発生しません。PropertyChange

DataGridaDataTableから anObservableCollection<MyDataObject>にバインドするように切り替えることをお勧めしMyDataObjectます

于 2013-03-15T15:45:00.447 に答える