积极答复者
datagrid不触发验证函数

问题
-
我使用了一个datagrid,有3列,其中两列是datagridcomboboxcolumn,另外一列是datagridtextcolumn。任何一列的输入不能为空。
我在每一列的binding中加入了自己的validationrule. updatesourcetrigger=lostfocus
当每次改变这些列的值时,都能正常触发验证函数。
但,如果不输入任意值或选择任意一个选项,离开该列时,则不会触发验证函数。
我只好使用rowvalidation,在每一行填写完成时去验证。
但,要求是每一列都不能为空,且实时验证,提示(红框)。
我觉得这些column应该在离开的时候就触发验证啊,这是by design还是bug?
除了使用datagridtemplatecolumn, 请教有其它解决方案吗?
答案
-
你好,
这是by design的,因为Validation是在Binding update的时候发生的。因为值没有改变,就不会有Binding update,所以验证不会被触发。
你可以通过把ValidationRule的ValidatesOnTargetUpdated属性设为True来解决这个问题。
当这个属性设置为True时,每当SourceToTarget的Binding update发生时,也会触发验证. 这样,当初始值通过绑定赋给TextBox时,就会触发一次验证。
Min Zhu [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
- 已标记为答案 ITKing 2011年6月20日 11:32
全部回复
-
代码在客户的机器上,拿不出来。
这是我写的一个测试,完整的代码不知道怎么放上来,所以贴了一部分关键的代码。
请关注Course ID 列。 该列不填仍能成功添加一行
<DataGrid Name="dataGrid1" FontSize="20" ItemsSource="{StaticResource courses}" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="Course Name" Binding="{Binding Name, TargetNullValue=(enter a course name)}"/> <DataGridTextColumn Header="Course ID"> <DataGridTextColumn.Binding> <Binding Path="Id" ValidatesOnExceptions="True"> <Binding.ValidationRules> <r:ValidNullRule/> </Binding.ValidationRules> </Binding> </DataGridTextColumn.Binding> </DataGridTextColumn> <DataGridTextColumn Header="Start Date" Binding="{Binding StartDate, ValidatesOnExceptions=True, StringFormat=d}"/> <DataGridTextColumn Header="End Date" Binding="{Binding EndDate, ValidatesOnExceptions=True, StringFormat=d}"/> </DataGrid.Columns> </DataGrid>
public class ValidNullRule : ValidationRule { public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) { ValidationResult ret = new ValidationResult(true, null); if (value.ToString() == "") ret = new ValidationResult(false, null); return ret; } }
-
你好,
这是by design的,因为Validation是在Binding update的时候发生的。因为值没有改变,就不会有Binding update,所以验证不会被触发。
你可以通过把ValidationRule的ValidatesOnTargetUpdated属性设为True来解决这个问题。
当这个属性设置为True时,每当SourceToTarget的Binding update发生时,也会触发验证. 这样,当初始值通过绑定赋给TextBox时,就会触发一次验证。
Min Zhu [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
- 已标记为答案 ITKing 2011年6月20日 11:32