datagrid的单元格验证绑定到动态数据 [英] Cell validation of datagrid bound to dynamic datatable

查看:263
本文介绍了datagrid的单元格验证绑定到动态数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个datagrid绑定到datatable。列数在运行期间决定。我使用Datagrid.RowValidationRule验证编辑后的单元格的内容。如果出现错误,则使用一种风格来突出显示带有红色边框的行。



是否可以突出显示具有红色边框的无效数据的单元格,而不是突出显示完整行?



Binding:

  ItemsSource ={Binding Path = ,ValidatesOnExceptions = True,NotifyOnValidationError = True,Mode = TwoWay,UpdateSourceTrigger = PropertyChanged,ValidatesOnDataErrors = True}
AutoGenerateColumns =True

验证:

 < DataGrid.RowValidationRules> 
< local:RowDataValidationRule ValidationStep =UpdatedValueValidatesOnTargetUpdated =True/>
< /DataGrid.RowValidationRules>

样式:

 code>< Style x:Key =RowStyleTargetType ={x:Type DataGridRow}> 
< Style.Triggers>
< Trigger Property =Validation.HasErrorValue =true>
< Setter Property =BorderThicknessValue =2/>
< Setter Property =BorderBrushValue =Red/>
< Setter Property =ToolTip
Value ={Binding RelativeSource = {RelativeSource Self},
Path =(Validation.Errors)[0] .ErrorContent}/>
< / Trigger>
< /Style.Triggers>
< / Style>

CodeBehind:

 code> public class RowDataValidationRule:ValidationRule 
{
public override ValidationResult Validate(object value,CultureInfo cultureInfo)
{

BindingGroup group =(BindingGroup)value ;

StringBuilder error = null;
foreach(group.Items中的var item)
{
DataRowView rowView = item as DataRowView;
if(rowView!= null)
{
//验证逻辑,设置错误
}
}
if(error!= null)
返回新的ValidationResult(false,error.ToString());
return ValidationResult.ValidResult;
}

}


解决方案

当然,您可以为每列指定一个或多个验证规则。
我们假设你有一个TextBox网格列绑定到描述 DataColumn
所以你可以这样定义你的 DataGridTextColumn (看看Binding节点)

 < DataGridTextColumn Header =Description> 
< DataGridTextColumn.Binding>
< Binding Path =[Description]>
< Binding.ValidationRules>
< local:MyValidationRule />
< /Binding.ValidationRules>
< / Binding>
< /DataGridTextColumn.Binding>
< / DataGridTextColumn>

编辑



当然可以使用代码来做同样的事情。
您只需要为DataGrid添加一个事件处理程序:

 < DataGrid AutoGenerateColumns =TrueAutoGeneratingColumn = DataGrid_AutoGeneratingColumn/> 

然后,您将以这种方式将验证规则添加到Binding:

  private void DataGrid_AutoGeneratingColumn(object sender,DataGridAutoGeneratingColumnEventArgs e)
{
绑定绑定;
DataGridTextColumn dataGridTextColumn = e.Column as DataGridTextColumn;
if(dataGridTextColumn!= null)
{
binding = new Binding(String.Concat([,dataGridTextColumn.Header,]));
binding.Mode = BindingMode.TwoWay;
binding.ValidationRules.Add(new MyValidationRule());

dataGridTextColumn.Binding = binding;
}
}

当然,您必须添加考虑其他DataGrid的逻辑列类型。


I've a datagrid bound to datatable. Number of columns are decided during runtime. I'm using Datagrid.RowValidationRule to validate contents of cell after edit. A style is used to highlight the row with red border in case of error.

Is it possible to highlight only the cells having invalid data with red border instead of highlighting complete row?

Binding:

 ItemsSource="{Binding Path=., ValidatesOnExceptions=True, NotifyOnValidationError=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" 
                                  AutoGenerateColumns="True"

Validation:

<DataGrid.RowValidationRules>
                                <local:RowDataValidationRule ValidationStep="UpdatedValue" ValidatesOnTargetUpdated="True"/>
                            </DataGrid.RowValidationRules>

Style:

 <Style x:Key="RowStyle" TargetType="{x:Type DataGridRow}">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true">
                <Setter Property="BorderThickness" Value="2"/>
                <Setter Property="BorderBrush" Value="Red"/>
                <Setter Property="ToolTip"
   Value="{Binding RelativeSource={RelativeSource Self},
       Path=(Validation.Errors)[0].ErrorContent}"/>
            </Trigger>
        </Style.Triggers>
    </Style>

CodeBehind:

public class RowDataValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {

        BindingGroup group = (BindingGroup)value;

        StringBuilder error = null;
        foreach (var item in group.Items)
        {
            DataRowView rowView = item as DataRowView;
            if (rowView != null)
            {
               // Validation logic, sets error
            }
        }
        if (error != null)
            return new ValidationResult(false, error.ToString());
        return ValidationResult.ValidResult;
    }

}

解决方案

Sure, you can specify one or more validation rules for each column. Let's suppose you have a TextBox grid column binded to the "Description" DataColumn. So you can define your DataGridTextColumn in this way (look at "Binding" node)

<DataGridTextColumn Header="Description">
    <DataGridTextColumn.Binding>
        <Binding Path="[Description]">
            <Binding.ValidationRules>
                <local:MyValidationRule />
            </Binding.ValidationRules>
        </Binding>
    </DataGridTextColumn.Binding>
</DataGridTextColumn>

EDIT

Of course you can do the same by using code. You just need to add an event handler to your DataGrid:

<DataGrid AutoGenerateColumns="True" AutoGeneratingColumn="DataGrid_AutoGeneratingColumn" />

Then you will add your validation rule to the Binding in this way:

private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    Binding binding;
    DataGridTextColumn dataGridTextColumn = e.Column as DataGridTextColumn;
    if(dataGridTextColumn != null)
    {
        binding = new Binding(String.Concat("[", dataGridTextColumn.Header, "]"));
        binding.Mode = BindingMode.TwoWay;
        binding.ValidationRules.Add(new MyValidationRule());

        dataGridTextColumn.Binding = binding;
    }
}

Of course you have to add logic for considering other DataGrid column types.

这篇关于datagrid的单元格验证绑定到动态数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆