datagrid的单元格验证绑定到动态数据 [英] Cell validation of datagrid bound to dynamic datatable
问题描述
是否可以突出显示具有红色边框的无效数据的单元格,而不是突出显示完整行?
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屋!