在 WPF 中使用依赖属性和样式触发器的验证
-
01-07-2019 - |
题
我正在尝试在 WPF 中使用验证。我创建了一个 NotNullOrEmptyValidationRule ,如下所示:
public class NotNullOrEmptyValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if (String.IsNullOrEmpty(value as String))
return new ValidationResult(false, "Value cannot be null or empty");
return new ValidationResult(true, null);
}
}
现在,我需要在我的应用程序中使用它。在我的 App.xaml 文件中,我声明了文本框的样式。这是声明。
<Style x:Key="textBoxStyle" TargetType="{x:Type TextBox}">
<Setter Property="Background" Value="Green"/>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="Background" Value="Red"/>
<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
现在,我想在我的 TextBox 上使用它,所以我使用以下代码:
<TextBox Style="{StaticResource textBoxStyle}">
<TextBox.Text>
<Binding>
<Binding.ValidationRules>
<NotNullOrEmptyValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
该错误出现在标签 NotNullOrEmptyValidationRule 上。XAML 语法检查器无法解析 NotNullOrEmptyValidationRule。我什至尝试过放置名称空间,但它似乎不起作用。
解决方案
我看到您在文本框上的绑定设置为“文本”路径 - 这是该文本框的数据上下文上的字段吗?文本框实际上得到了一个值吗?另外,如果您在验证方法中放置断点,是否会被解雇?
您可能想查找如何记录绑定失败并查看这些失败。
其他提示
您只需将 xmlns 添加到您的窗口,并使用它来引用您的 ValidationRule。
在 WPF 中,该对象完全可以在同一程序集中使用。
由于您的规则未在标准 XAML 命名空间中定义,因此您必须创建到 clr 命名空间的映射,如下所示:
<Window ...
xmlns:local="clr-namespace:MyNamespaceName">
然后你会像这样使用它:
<Binding Path=".">
<Binding.ValidationRules>
<local:NotNullOrEmptyValidationRule />
</Binding.ValidationRules>
</Binding>
编辑我向绑定添加了一条路径语句。你必须告诉 Binding 要绑定什么:)
你的代码后面没有这一行
Public Sub New()
' This call is required by the Windows Form Designer.
InitializeComponent()
Me.**NameOfTextBox**.DataContext = Me
End Sub
Visual Studio 和 Expression Blend 中存在导致此问题的错误。您需要做的是确保验证规则位于您可以引用的单独项目/程序集中。这应该可以解决问题。
但是,您必须重新添加命名空间才能使其正常工作。
不隶属于 StackOverflow