gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:21:30 24 4
gpt4 key购买 nike

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

我想像这样将验证规则应用于顶级自定义控件。我已尽我所能修剪多余的代码以使我的示例更通用,但如果我还没有完全成功,请多多包涵。我对在论坛上发布代码的想法有些陌生。

<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,并且看起来比我可以让它按照我想要的方式工作要优雅得多。

感谢大家的关注和建议。

问候,
维克

最佳答案

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

如果您可以在控件上设置规则,那么,在其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 的绑定(bind)文本框的属性(有点棘手,现在不记得语法了)。
  • 将上述属性中的验证规则添加到绑定(bind)中。
  • 关于wpf - 将 wpf 验证规则应用于自定义用户控件内的文本框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10819103/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com