none
datagrid不触发验证函数 RRS feed

  • 问题

  • 我使用了一个datagrid,有3列,其中两列是datagridcomboboxcolumn,另外一列是datagridtextcolumn。任何一列的输入不能为空。

    我在每一列的binding中加入了自己的validationrule. updatesourcetrigger=lostfocus

    当每次改变这些列的值时,都能正常触发验证函数。

    但,如果不输入任意值或选择任意一个选项,离开该列时,则不会触发验证函数。

    我只好使用rowvalidation,在每一行填写完成时去验证。

    但,要求是每一列都不能为空,且实时验证,提示(红框)。

    我觉得这些column应该在离开的时候就触发验证啊,这是by design还是bug?

    除了使用datagridtemplatecolumn, 请教有其它解决方案吗?

    2011年6月15日 8:07

答案

  • 你好,

    这是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
    2011年6月17日 7:15
    版主

全部回复

  • 能提供个小的测试程序么?
    Stay hungry, stay foolish
    2011年6月15日 9:57
  • 代码在客户的机器上,拿不出来。

    这是我写的一个测试,完整的代码不知道怎么放上来,所以贴了一部分关键的代码。

    请关注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;
        }
      }

    2011年6月15日 10:15
  • 你好,

    这是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
    2011年6月17日 7:15
    版主