我有一个在实体元数据类中设置了一些验证的表单。然后通过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事件永远不会被触发。 如何解决?
答案 0 :(得分:2)
为什么使用Explicit UpdateSourceTrigger?
当绑定更新源对象时,Silverlight验证在绑定框架内发生。你有这种方式,不会有绑定验证错误,因为你永远不会告诉绑定更新源对象。嗯,实际上你做了,但它发生在验证错误事件处理程序中。你写过鸡蛋和鸡蛋代码。
UpdateSourceTrigger
或将其设置为Default
。 BindingExpression.UpdateSource
的显式调用。 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
}