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

aza*_*arp 1 validation wpf validationrules

我试图在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); 
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在,我需要在我的应用程序中使用它.在我的App.xaml文件中,我为TextBox声明了Style.这是宣言.

 <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>
Run Code Online (Sandbox Code Playgroud)

现在,我想在我的TextBox上使用它,所以我使用以下代码:

  <TextBox Style="{StaticResource textBoxStyle}">
                <TextBox.Text>
                    <Binding>
                        <Binding.ValidationRules>
                            <NotNullOrEmptyValidationRule />
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>


            </TextBox>
Run Code Online (Sandbox Code Playgroud)

Tag NotNullOrEmptyValidationRule上出现错误.XAML语法检查程序无法解析NotNullOrEmptyValidationRule.我甚至尝试过放置命名空间但它似乎不起作用.

Abe*_*cht 5

您只需将xmlns添加到Window,并使用它来引用您的ValidationRule.

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

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

<Window ...
    xmlns:local="clr-namespace:MyNamespaceName">
Run Code Online (Sandbox Code Playgroud)

然后你会像这样使用它:

<Binding Path=".">
    <Binding.ValidationRules>
        <local:NotNullOrEmptyValidationRule />
    </Binding.ValidationRules>
</Binding>
Run Code Online (Sandbox Code Playgroud)

编辑 我在Binding中添加了一个Path语句.你必须告诉绑定要绑定的内容:)