在WPF中使用带有依赖属性和样式触发器的验证

在WPF中使用带有依赖属性和样式触发器的验证,wpf,validation,validationrules,Wpf,Validation,Validationrules,我试图在WPF中使用验证。我创建了一个NotNullOrEmptyValidationRule,如下所示: public class NotNullOrEmptyValidationRule : ValidationRule { public override ValidationResult Validate(object value, CultureInfo cultureInfo) { if (String.IsNullOrE

我试图在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 Style="{StaticResource textBoxStyle}">
                <TextBox.Text>
                    <Binding>
                        <Binding.ValidationRules>
                            <NotNullOrEmptyValidationRule />
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>


            </TextBox>

错误出现在标记NotNullOrEmptyValidationRule上。XAML语法检查器无法解析NotNullOrEmptyValidationRule。我甚至尝试过放置名称空间,但它似乎不起作用

Visual Studio和Expression Blend中存在导致此问题的错误。您需要做的是确保验证规则位于可以引用的单独项目/程序集中。这应该可以解决问题


但是,您必须重新添加名称空间才能使其正常工作。

Visual Studio和Expression Blend中有一个bug导致了此问题。您需要做的是确保验证规则位于可以引用的单独项目/程序集中。这应该可以解决问题


但是,您必须重新添加名称空间才能使其工作。

您只需要将XMLN添加到窗口中,并使用它引用您的ValidationRule

在WPF中,对象完全可以从同一程序集中使用

由于您的规则未在标准XAML命名空间中定义,因此必须创建到clr命名空间的映射,如下所示:

<Window ...
    xmlns:local="clr-namespace:MyNamespaceName">
然后你会这样使用它:

<Binding Path=".">
    <Binding.ValidationRules>
        <local:NotNullOrEmptyValidationRule />
    </Binding.ValidationRules>
</Binding>
编辑
我在绑定中添加了一个Path语句。您必须告诉绑定要绑定到什么:

您只需要将xmlns添加到窗口中,并使用它引用您的ValidationRule

在WPF中,对象完全可以从同一程序集中使用

由于您的规则未在标准XAML命名空间中定义,因此必须创建到clr命名空间的映射,如下所示:

<Window ...
    xmlns:local="clr-namespace:MyNamespaceName">
然后你会这样使用它:

<Binding Path=".">
    <Binding.ValidationRules>
        <local:NotNullOrEmptyValidationRule />
    </Binding.ValidationRules>
</Binding>
编辑
我在绑定中添加了一个Path语句。您必须告诉绑定要绑定到什么:

我看到您在文本框上的绑定被设置为“Text”路径,这是该文本框的datacontext上的字段吗?文本框是否实际获得了输入的值?另外,如果您在验证方法中设置了断点,是否会被触发


您可能希望查找如何记录绑定中的失败,并查看这些失败

我看到您在文本框上的绑定被设置为“Text”路径,这是文本框的datacontext上的字段吗?文本框是否实际获得了输入的值?另外,如果您在验证方法中设置了断点,是否会被触发


您可能希望查找如何记录绑定中的失败,并查看这些失败

您的代码中没有这一行

Public Sub New()

    ' This call is required by the Windows Form Designer.
    InitializeComponent()

    Me.**NameOfTextBox**.DataContext = Me
End Sub

您的代码中没有这一行

Public Sub New()

    ' This call is required by the Windows Form Designer.
    InitializeComponent()

    Me.**NameOfTextBox**.DataContext = Me
End Sub