首页 > 解决方案 > 文本框验证:控制/复制系统验证边框?

问题描述

我想验证应用程序的文本框条目,并在出现错误时提供视觉和口头反馈。我希望您在使用ValidationRulesor时从 wpf 获得正常的文本框边框行为INotifyDataError,然后在单独的 TextBlock 中显示错误消息。标准的东西。我有几种方法可以解决这个问题,但每一种都给我带来了问题。

ValidationRules似乎是最简单的基于系统的方法。我的问题是将错误消息绑定到单独的 TextBlock。大多数示例使用内容呈现器或错误模板,但是没有简单的方法可以ValidationResult直接绑定到 a 吗?(问题 1)

INotifyDataError作为更现代的方法在理论上很好,但对于我正在做的事情来说似乎太复杂了。

但是,我发现最简单的方法是直接在 Viewmodel 的属性设置器中进行验证。像这样的东西:

private string _fileName;
public string FileName
{
   get {return _fileName;}
   set
   {
       _fileName = value;
       if(String.IsEmptyOrNull(value))
       {
           FileNameError = "File must have a name.";
       }
       else
       {
           FileNameError = null;
       }
       RaisePropertyChanged();
    }
}

private string _fileNameError;
public string FileNameError
{
   get {return _fileNameError;}
   set
   {
       _fileNameError = value;
       RaisePropertyChanged();
   }
}

然后,为了显示错误,我可以将 2x 绑定到FileNameError:一次显示 TextBlock 中的文本,另一个通过转换器(检查!null)显示 TextBox 周围的红色边框。

WPF 处理红色边框的方式的问题要好得多;它似乎是它自己的元素,而不是实际的边界。当我尝试使用我的 StringToBorderBrush 转换器时,边框的粗细会减小 TextBox 的大小,因此不再排列整齐。双重打击是,通过将 BorderBrush 设置为透明,我失去了我想保留的 TextBox 的默认边框和焦点边框。

那么有没有办法复制 WPF 对边框所做的事情,或者以某种方式使用属性来控制它?我认为这是可能的,因为当它用ValidationRulesor显示时必须调用它INotifyDataError,对吗?(问题2)

标签: c#wpfvalidationdata-binding

解决方案


推荐阅读