我有一个自定义控件,里面有一个文本框。我想应用一些包含传递参数的自定义验证规则(例如,实现范围检查)。
我想像这样将验证规则应用于顶级自定义控件。我已尽我所能删除多余的代码以使我的示例更通用,但如果我没有完全成功,请多多包涵。我对在论坛上发布代码的想法有些陌生。
<ns_control:CustomControl PropertyName="Value from embedded textBox:"
Style="{StaticResource errorInTextBox}">
<ns_control:CustomControl.PropertyValue>
<Binding Path="PathX"
Mode="TwoWay">
<Binding.ValidationRules>
<validation:IntegerInputRule Max="100" />
</Binding.ValidationRules>
</Binding>
</ns_control:CustomControl.PropertyValue>
</ns_control:CustomControl>
好的,这就是控件的调用。我的实际代码中有一些东西,Validation.ErrorTemplate 也被设置为做某事,但这对这个例子来说似乎是多余的。样式 errorInTextBox 是问题的核心,因为它设置了我希望自定义控件中的 texbox 在验证规则失败时如何操作。到目前为止,我能够弄清楚如何做到这一点的最好方法是使用 Style.Resources 将我想要的样式应用于驻留在我的自定义控件中的任何文本框。
<Style x:Key="errorInTextBox"
TargetType="Control">
<Style.Resources>
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError"
Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}" />
<Setter Property="BorderBrush"
Value="Green" />
</Trigger>
</Style.Triggers>
</Style>
</Style.Resources>
</Style>
如果发现错误,上面会显示工具提示并更改文本框的边框,或者至少这是我想要的。我的主要问题是 Style.Trigger——这是我的失败点。我希望当 Validation.HasError 为真时触发。问题是,由于验证规则是针对自定义控件而不是其中的文本框设置的,因此文本框似乎不知道 HasError 值实际上是什么。我尝试使用Validation.ErrorTemplate 来修改borderbrush 属性等,但模板似乎无法像我上面使用的Style.Resource 那样访问文本框的属性,因此它无法修改文本框周围的边框,等等
有没有办法解决这个问题,或者我应该简单地放弃封装的想法,而只是从头开始定义文本框,无论我以这种方式使用我的自定义控件并且我需要验证?在那里定义它们可以让我访问文本框属性,但它会导致大量冗余的 XAML,并且看起来比我可以让它按照我想要的方式工作要优雅得多。
感谢大家的关注和建议。
问候,维克