wpf mes 数据验证
时间: 2025-05-18 09:59:07 浏览: 16
### WPF MES 系统中的数据验证实现
在构建基于 Windows Presentation Foundation (WPF) 的制造执行系统 (MES) 时,数据验证是一个至关重要的部分。它不仅确保输入的数据符合业务逻辑的要求,还能够提升用户体验并减少潜在错误的发生。
#### 数据验证的核心概念
WPF 提供了一种强大的机制来处理数据验证——通过绑定引擎和 `IDataErrorInfo` 或者 `INotifyDataErrorInfo` 接口[^2]。这些接口允许开发者定义自定义的验证逻辑,并将其集成到视图模型中。这种设计遵循 Model-View-ViewModel (MVVM) 架构模式,从而保持代码的清晰性和可维护性。
以下是具体实现方法:
---
#### 使用 IDataErrorInfo 实现基本验证
`IDataErrorInfo` 是一种简单而有效的验证方式,适用于大多数场景。其实现如下所示:
```csharp
public class MesModel : INotifyPropertyChanged, IDataErrorInfo
{
private string _productName;
public string ProductName
{
get => _productName;
set
{
if (_productName != value)
{
_productName = value;
OnPropertyChanged(nameof(ProductName));
}
}
}
public string Error => null; // 不常用的整体错误信息
public string this[string columnName]
{
get
{
switch (columnName)
{
case nameof(ProductName):
if (string.IsNullOrWhiteSpace(_productName))
return "产品名称不能为空";
break;
}
return null; // 验证成功返回 null
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
```
上述代码展示了如何针对特定属性(如 `ProductName`)实施简单的非空校验[^3]。
---
#### 使用 INotifyDataErrorInfo 支持异步或多条件验证
对于更复杂的场景,例如需要网络请求或其他耗时操作完成验证的情况,则可以采用 `INotifyDataErrorInfo` 接口。该接口支持多条错误消息以及动态更新的能力。
下面是一段示例代码:
```csharp
public class AdvancedMesModel : INotifyPropertyChanged, INotifyDataErrorInfo
{
private readonly Dictionary<string, List<string>> _errorsByPropertyName =
new Dictionary<string, List<string>>();
private string _batchNumber;
public string BatchNumber
{
get => _batchNumber;
set
{
if (_batchNumber != value)
{
_batchNumber = value;
ValidateBatchNumber();
OnPropertyChanged(nameof(BatchNumber));
}
}
}
public bool HasErrors => _errorsByPropertyName.Any(kvp => kvp.Value.Count > 0);
public IEnumerable GetErrors(string propertyName)
{
if (string.IsNullOrEmpty(propertyName) || !_errorsByPropertyName.ContainsKey(propertyName))
return null;
return _errorsByPropertyName[propertyName];
}
private void ValidateBatchNumber()
{
ClearErrors(nameof(BatchNumber));
if (string.IsNullOrWhiteSpace(_batchNumber))
{
AddError(nameof(BatchNumber), "批次号不能为空");
}
else if (!_batchNumber.All(char.IsDigit)) // 假设只接受数字作为有效输入
{
AddError(nameof(BatchNumber), "批次号应仅包含数字字符");
}
}
private void AddError(string propertyName, string error)
{
if (!_errorsByPropertyName.ContainsKey(propertyName))
_errorsByPropertyName[propertyName] = new List<string>();
_errorsByPropertyName[propertyName].Add(error);
RaiseErrorsChanged(propertyName);
}
private void ClearErrors(string propertyName)
{
if (_errorsByPropertyName.ContainsKey(propertyName))
{
_errorsByPropertyName[propertyName].Clear();
RaiseErrorsChanged(propertyName);
}
}
private void RaiseErrorsChanged(string propertyName)
{
ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
}
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
```
此代码片段实现了更为灵活的验证逻辑,包括批量清除错误、添加新错误等功能[^4]。
---
#### 将验证结果反馈至 UI 层
为了使用户界面实时反映验证状态,在 XAML 中可以通过设置 `Validation.ErrorTemplate` 和绑定 `Binding.ValidatesOnDataErrors=True` 来展示错误提示信息。例如:
```xml
<TextBox>
<TextBox.Text>
<Binding Path="BatchNumber" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"
ValidatesOnDataErrors="True">
<Binding.ValidationRules>
<!-- 可选:额外增加其他规则 -->
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<!-- 自定义错误模板 -->
<Control.Template>
<ControlTemplate>
<DockPanel LastChildFill="True">
<TextBlock DockPanel.Dock="Bottom" Foreground="Red" FontSize="10"
Text="{Binding ElementName=textBox, Path=(Validation.Errors)[0].ErrorContent}" />
<Border BorderBrush="Red" BorderThickness="1">
<AdornedElementPlaceholder Name="adorner"/>
</Border>
</DockPanel>
</ControlTemplate>
</Control.Template>
```
以上配置会自动显示红色边框及下方的文字说明当发生验证失败时[^5]。
---
#### 总结建议
尽管 ASP.NET MVC 更倾向于将验证置于模型层[^1],但在 WPF 应用程序开发过程中推荐利用 MVVM 结合 `IDataErrorInfo` 或 `INotifyDataErrorInfo` 进行前端层面的初步过滤;同时后台服务端仍需重复检查提交过来的信息以防遗漏任何可能的安全隐患或非法参数传递情况。
阅读全文
相关推荐













