在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