如何使用附加行为将文本框输入标记为无效

How to flag a textbox input as invalid by using an attached behavior

我的 xaml 上有很多文本框,我在其中实施了正则表达式验证(来自
How to Define TextBox Resctrictions)。在我看来,这采用以下形式:

 <TextBox 
             h:ColorMaskingTextBoxBehavior.Mask="^(?:\d{5})(?:-\d{4})?$"
             Text="{Binding ZipCode}"
            Height="21" HorizontalAlignment="Left" Margin="152,207,0,0"  VerticalAlignment="Top" Width="96"
             />

我不想限制用户的移动,所以当前验证只是更改文本框的颜色;红色是发现错误。

收集完所有输入后,用户将单击“保存”以保存 window。 可能涉及正则表达式代码,将它们从 xaml 复制到执行保存的视图模型似乎是错误的。

附加行为如何将文本框标记为无效,以便视图模型只需要在保存 window 之前检查无效标记?我的第一个想法是在文本框上绑定 Tag 依赖项 属性 但我想知道是否有更好的方法?

欢迎任何想法。

TIA

我会将所有验证移至视图模型,这就是它的用途。在视图中包含应用程序逻辑不是好的 MVVM 实践。视图应该可以互换,而不需要重新编码验证逻辑。 然后,您可以使用绑定到视图模型中属性的样式中的触发器来更改 TextBox 的外观,而不是使用附加行为。

有些人使用 IDataErrorInfo 接口。我没有。

创建一个视图模型 属性 以确定 ZipCodeIsValid 是否:

public bool ZipCodeIsValid
{
    get
    {
        var zipCodeRegex = new Regex("^(?:\d{5})(?:-\d{4})?$");
        var zipCodeMatch = zipCodeRegex.Match(ZipCodeText);
        return zipCodeMatch.Success;    
    }
}

每次 ZipCodeText 属性 改变时,引发通知 属性 改变事件 ZipCodeIsValid 属性.

为您的文本框创建样式:

<Style TargetType="TextBox">
    <Setter Property="Foreground" Value="Black"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding ZipCodeIsValid}" Value="False">
             <Setter Property="Foreground" Value="Black"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

如果您不想做那么大的更改并且正在寻找更快的解决方案,您可以将正则表达式字符串移动到静态属性并将它们与附加行为一起使用,那么您就不会复制正则表达式并可以在视图模型中使用它们来测试验证是否通过。

使用名为 ZipCode 的静态字符串 属性 创建一个名为 ValidationRegex 的 class:

public class ValidationRegex
{
    public static string ZipCode = "^(?:\d{5})(?:-\d{4})?$";
}

将其与附加行为一起使用:

<TextBox h:ColorMaskingTextBoxBehavior.Mask="{x:Static ValidationRegex.ZipCode}"/>

在您的视图模型中使用它:

public void Save()
{
    var zipCodeRegex = new Regex(ValidationRegex.ZipCode);
    var zipCodeMatch = zipCodeRegex.Match(ZipCodeText);
    if (!zipCodeMatch.Success)
    {
        throw new ValidationException("Zip code is invalid!");
    }
}