在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