0

これが私が達成したいことです。DataGriddのバインドされたコレクションには、以下に示すようにRowModelのインスタンスが含まれ(簡単にするために最小化されています)、RowModelにValidationClassのインスタンスを含めることができます。

public class RowModel
{
    public int RowId { get; set; }
    public string Column1 { get; set; }
    public string Column2 { get; set; }
    public string Column3 { get; set; }
    public ICollection<ValidationClass> Validations { get; set; }
}

public class ValidationClass
{
    public string Tag { get; set; }
    public string SourceColumn { get; set; }
    public string ErrorText { get; set; }
}

ValidationClass.SourceColumnsは、エラーのあるRowModelの列を参照します。ValidationClassのTagプロパティは、「Critical」または「Warning」のいずれかになります。

検証は、外部バリデーターから入力されたデータベースから取得されます。また、1つ以上の列で検証エラーが発生した場合、コレクションはエラーごとに1つのValidationClassで埋められます。

ここで、重大なエラーがあるセルに赤い背景色を設定し、警告があるセルに黄色の背景色を設定したい場合、どうすればよいですか?

DataTriggersまたはConverters、または他の何か?私を正しい方向に向けるために助けが必要です。

編集:明確にするために、私はこれにC#.net4WPFDataGridを使用しています。

4

3 に答える 3

1

トリガーとコンバーターはどちらもその問題に対して同等に有効です。ここにトリガー付きのソリューションがあります:

<DataGrid.Resources>
    <Style TargetType="{x:Type DataGridCell}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=Tag}" Value="Critical">
                <Setter Property="Background" Value="Red"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=Tag}" Value="Warning">
                <Setter Property="Background" Value="Yellow"/>
            </DataTrigger>
于 2012-06-05T15:27:31.990 に答える
1

これが私がコンバーターを使ってそれを解決した方法です。

指定された列を持つDataGridがあり、各列は次のように定義されています。

<MyOwn:CustomDataGridColumn Header="Column1Header" Name="Column1" ElementStyle="{StaticResource ElementStyleWithMultiConverterAndTriggers}">
    <MyOwn:CustomDataGridColumn.Binding>
        <Binding Path="RowModel.ColumnName"  ValidatesOnDataErrors="True" >
            <Binding.ValidationRules>
                <Validators:CustomCellDataInfoValidationRule />
                    </Binding.ValidationRules>
            </Binding>
    </MyOwn:CustomDataGridColumn.Binding>
</MyOwn:CustomDataGridColumn>

次に、次のようなDataTriggersを使用してスタイルを添付しました。

<Style TargetType="{x:Type TextBlock}" x:Key="ElementStyleWithMultiConverterAndTriggers">
    <Style.Resources>
        <Utils:ErrorTypeConverter x:Key="ErrorTypeConverter"/>
    </Style.Resources>
    <Setter Property="TextBlock.Padding" Value="2" />
    <Setter Property="Validation.ErrorTemplate" Value="{x:Null}" />

    <Style.Triggers>
        <DataTrigger Value="Critical" >
            <DataTrigger.Binding>
                <MultiBinding Converter="{StaticResource ErrorTypeConverter}">
                    <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type DataGridCell}}" Path="Column.Name"/>
                    <Binding Path="RowModel" /> <!--Sending the whole row object as one of the parameters to the converter-->
                </MultiBinding>
            </DataTrigger.Binding>
            <Setter Property="Background" Value="Red"/>             
        </DataTrigger>

        <DataTrigger Value="Warning" >
            <DataTrigger.Binding>
                <MultiBinding Converter="{StaticResource ErrorTypeConverter}">
                    <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type DataGridCell}}" Path="Column.Name"/>
                    <Binding Path="RowModel" />
                </MultiBinding>
            </DataTrigger.Binding>
            <Setter Property="Background" Value="Yellow"/>                              
        </DataTrigger>            
    </Style.Triggers>        
</Style>

MultiValueConverterは次のようになります。

public class ErrorTypeConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var rowObject = values[1] as RowModel;
        var param = values[0].ToString();
        if (rowObject == null) return "";
        if (rowObject.ValidationClass.Any())
        {
            var validationErrors = rowObject.ValidationClass.FirstOrDefault(x => x.SourceColumn == param);
            if (validationErrors != null )
                return validationErrors.Tag; // Will return "Critical" or "Warning"
        }
        return "";
    }

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

このスイートは私のニーズですが、検索結果に1000行以上のDataGridでは重いです。しかし、それは何もないよりはましです。どんな改善でも大歓迎です。

于 2012-06-11T08:25:24.883 に答える
0

CellFormattingイベントを使用します。そこで、あなたはあなたの状態をチェックし、使用して色を設定することができます-

e.CellStyle.BackColor

リンクのmsdnサンプルを参照してください。

于 2012-06-05T15:30:23.827 に答える