我已经让WPF验证运行起来了(在绑定中添加了
ValidationRules
),并且通过模板可以创建漂亮的装饰器。网络上有很多相关帖子。
但我找不到一种方法将错误消息显示在装饰控件之外的固定位置,比如窗口角落的 TextBlock
中。
我该如何实现这个?我能否将所有验证错误信息绑定到我的DataContext
(这里是ViewModel)?
更新:由于得到了一个答案,现在部分工作已经完成。验证消息现在显示在另一个标签中。由于所有带有其验证规则的文本框都是通过代码动态创建的,因此进行绑定的方式如下:
Binding bindSite = new Binding();
bindSite.Source = this.validationErrorDisplayLabel;
BindingOperations.SetBinding(textBox, Validation.ValidationAdornerSiteProperty, bindSite);
但是验证消息仅被转发给最后一个执行此代码的文本框的adornersite
。
我在这个小例子中重现了这个问题。
XAML:
<Grid>
<TextBox
Validation.ValidationAdornerSite="{Binding ElementName=ErrorDisplay}"
HorizontalAlignment="Left" Height="23" Margin="10,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120">
<TextBox.Text>
<Binding>
<Binding.Path>Box1</Binding.Path>
<Binding.ValidationRules>
<local:RuleA />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<TextBox
Validation.ValidationAdornerSite="{Binding ElementName=ErrorDisplay}"
HorizontalAlignment="Left" Height="23" Margin="10,38,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120">
<TextBox.Text>
<Binding>
<Binding.Path>Box2</Binding.Path>
<Binding.ValidationRules>
<local:RuleA />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<TextBlock
x:Name="ErrorDisplay"
Background="AntiqueWhite"
Foreground="Red"
Text="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.ValidationAdornerSiteFor).(Validation.Errors)[0].ErrorContent}"
HorizontalAlignment="Left" Margin="230,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" RenderTransformOrigin="2.218,-4.577" Width="177" Height="51"/>
</Grid>
RuleA
类在值等于字符串"A"
时产生验证错误。第二个文本框中的错误会显示在中,而第一个文本框的错误不会被显示(它使用默认模板并获得红色边框)。
如何使其两者都适用?TextBlock不需要汇总所有错误,而只需显示第一个错误即可。
Validation.ValidationAdornerSite
和Validation.ValidationAdornerSiteFor
,我将验证结果传递到了另一个控件。但是它仅适用于最后一个分配了..AdornerSite
的文本框中的错误。 - ZoolWay