为什么无法在validationSummary中显示验证错误?

时间:2010-09-03 19:41:25

标签: silverlight-4.0 validation wcf-ria-services

我有一个在实体元数据类中设置了一些验证的表单。然后通过VM将实体实例绑定到UI。如下:

Xaml喜欢:

   <Grid x:Name="LayoutRoot">
            <StackPanel VerticalAlignment="Top">
                <input:ValidationSummary />
            </StackPanel>
      <TextBox Text="{Binding Name, Mode=TwoWay}" />
      <ComboBox x:Name="xTest" ItemsSource="{Binding MyList}"
               SelectedItem="{Binding MyItem,Mode=TwoWay,
               DisplayMemberPath="MyName"
               ValidatesOnDataErrors=True,
               ValidatesOnNotifyDataErrors=True,
               ValidatesOnExceptions=True,
               NotifyOnValidationError=True,UpdateSourceTrigger=Explicit}"  />
      </Grid>

代码隐藏:

public MyForm()
{
  InitializeComponent();
  this.xTest.BindingValidationError +=new EventHandler<ValidationErrorEventArgs>((s,e)=>{

  BindingExpression be = this.xTest.GetBindingExpression(ComboBox.SelectedItemProperty);
  be.UpdateSource();

  if (e.Action == ValidationErrorEventAction.Added)
    ((ComboBox)s).Foreground = new SolidColorBrush(Colors.Red);
  });
}

元数据如:

[Required]
 public string Name { get; set; }

 [RequiredAttribute]
 public int MyItemID { get; set; }

但是在运行应用程序时,我在valudationSummary中没有显示任何内容。 对于CombBox,即使有错误,看起来像BindingValidationError事件永远不会被触发。 如何解决?

1 个答案:

答案 0 :(得分:2)

为什么使用Explicit UpdateSourceTrigger?

当绑定更新源对象时,Silverlight验证在绑定框架内发生。你有这种方式,不会有绑定验证错误,因为你永远不会告诉绑定更新源对象。嗯,实际上你做了,但它发生在验证错误事件处理程序中。你写过鸡蛋和鸡蛋代码。

  • 删除绑定中的UpdateSourceTrigger或将其设置为Default
  • 删除对BindingExpression.UpdateSource的显式调用。
  • 删除将ComboBox前景设置为红色 - 您正在使用NotifyOnValidationError=True,这样就无需手动为控件着色。
  • 从绑定
  • 中删除DisplayMemberPath

所以你的XAML:

<Grid x:Name="LayoutRoot"> 
    <StackPanel VerticalAlignment="Top"> 
         <input:ValidationSummary /> 
         <ComboBox x:Name="xTest" ItemsSource="{Binding MyList}" 
               SelectedItem="{Binding MyItem,
               Mode=TwoWay, 
               ValidatesOnDataErrors=True, 
               ValidatesOnNotifyDataErrors=True, 
               ValidatesOnExceptions=True, 
               NotifyOnValidationError=True}"  /> 
      </StackPanel> 
</Grid> 

你的代码:

public MyForm()   
{   
  InitializeComponent();   
  // you don't need anything here to have the validations work
}