在WPF中使用带有依赖项属性和样式触发器的验证
时间:2020-03-06 14:23:16 来源:igfitidea点击:
我正在尝试在WPF中使用Validation。我创建了一个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文件中,我声明了TextBox的样式。这是声明。
<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。我什至尝试放置命名空间,但它似乎无法正常工作。
解决方案
Visual Studio和Expression Blend中没有一个错误会导致此问题。我们需要做的是确保"验证"规则位于我们可以引用的单独项目/程序集中。这样可以解决问题。
但是,我们将不得不重新添加名称空间以使其起作用。
我们只需要将xmlns添加到Window中,并使用它来引用ValidationRule。
在WPF中,可以很好地使用同一装配中的对象。
由于规则未在标准XAML命名空间中定义,因此我们必须创建到clr命名空间的映射,如下所示:
<Window ...
xmlns:local="clr-namespace:MyNamespaceName">
然后我们将使用它,如下所示:
<Binding Path=".">
<Binding.ValidationRules>
<local:NotNullOrEmptyValidationRule />
</Binding.ValidationRules>
</Binding>
编辑
我在绑定中添加了Path语句。我们必须告诉Binding绑定到什么:)
我看到我们在TextBox上的绑定设置为" Text"的路径,这是该TextBox的datacontext上的字段吗?文本框实际上是在输入值吗?另外,如果我们在验证方法中设置了断点,是否会触发该断点?
我们可能想要查找如何记录绑定失败并也进行复习。
我们在代码中没有此行
Public Sub New()
' This call is required by the Windows Form Designer.
InitializeComponent()
Me.**NameOfTextBox**.DataContext = Me
End Sub

