将wpf验证规则应用于自定义用户控件内的文本框

时间:2012-05-30 15:10:38

标签: wpf validation xaml

我有一个自定义控件,里面有一个文本框。我想应用一些包含传递参数的自定义验证规则(例如,实现范围检查)。

我想将验证规则应用于顶级自定义控件,就像这样。我已经尽力删除多余的代码以使我的示例更加通用,但如果我没有完全成功,请耐心等待。我对在论坛中发布代码的想法有点新鲜。

<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被设置为执行某些操作,但这对于此示例来说似乎是多余的。 Style,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那样访问文本框的属性,因此无法修改文本框周围的边框,等。

有没有解决这个问题的方法,或者我应该放弃封装的想法,只要我以任何方式从头开始定义文本框,无论我以这种方式使用自定义控件,我都需要验证?在那里定义它们会让我访问文本框属性,但它会导致大量的redudnant XAML,并且看起来不如我能按照我想要的方式工作。

感谢您的眼球和建议。

此致 维克

1 个答案:

答案 0 :(得分:0)

从问题我不确定你是否可以容忍在控件而不是文本框中设置验证规则。

如果您可以在控件上设置规则,则在其ControlTemplate中为文本框命名(我假设为x:Name="TextHolder")。在ControlTemplate.Triggers添加:

<Trigger Property="Validation.HasError"
         Value="True">
    <Setter TargetName="TextHolder"
            Property="ToolTip"
            Value="{Binding RelativeSource={RelativeSource Self},
            Path=(Validation.Errors)[0].ErrorContent}" />
    <Setter TargetName="TextHolder"
            Property="BorderBrush"
            Value="Green" />
</Trigger>

这将检查控件的验证,如果失败,setter将访问文本框的属性。


如果必须在文本框中设置规则 -

  • 向控件添加类型为ValidationRule的依赖项属性。
  • Template.FindName覆盖范围内的模板OnApplyTemplate获取文本框。
  • 获取文本框的Text属性的绑定(有点棘手,现在不记得语法)。
  • 将验证规则从上面的属性添加到绑定。