gpt4 book ai didi

wpf - IDataErrorInfo:验证页面何时提交

转载 作者:行者123 更新时间:2023-12-05 00:06:58 25 4
gpt4 key购买 nike

我正在创建一个将使用 IDataErrorInfo 的 WPF 应用程序我的业务对象实现的数据验证。我一直在使用 this demo from a blog post了解ValidatesOnDataErrors .

该演示是一个简单的应用程序,它将几个文本框绑定(bind)到一个联系人对象并实现 IDataErrorInfo验证,使用 ValidatesOnDataErrors=True在数据绑定(bind)中。为了有效,文本框必须至少有五个字符。

这是我的问题:在演示中,只要文本框失去焦点,就会触发验证。事实上,当应用程序启动时,文本框初始化为无效状态(红色边框)。我的应用程序必须推迟验证,直到用户单击“确定”按钮提交页面。那时,文本框应该被验证,如果无效则进入错误状态。

那么,我将如何推迟对文本框的验证,直到用户单击“确定”按钮?谢谢你的帮助。

最佳答案

感谢迈克尔的帮助。不幸的是,我需要绑定(bind)保持不断同步,只有延迟验证。否则,迈克尔的解决方案就可以完成这项工作。所以,我走向了一个稍微不同的方向。这是我最终实现的解决方案。

简单演示:让我们从最简单的情况开始:我的业务对象实现 IDataErrorInfo ;假设我可以修改它的实现方式。我给每个业务对象一个额外的 bool 属性 ValidationEnabled ,我修改了IDataErrorInfo如果该属性为假,则实现始终返回空结果。

我在原始帖子中提到的演示使用具有两个属性的 Contact 对象;名字和姓氏。我添加了一个 ValidationEnabled 属性并修改了 IDataErrorInfo实现如下所示:

#region IDataErrorInfo Members

public string Error
{
get { throw new System.NotImplementedException(); }
}

public string this[string columnName]
{
get
{
// Initialize
string result = null;

// Perform validation only if enabled
if (ValidationEnabled)
{
switch (columnName)
{
// Validate 'First Name'
case "FirstName":
if (string.IsNullOrEmpty(FirstName))
{
result = "First name has to be set";
}
else if(FirstName.Length < 5)
{
result = "First name must be at least five characters";
}
break;

// Validate "Last Name"
case "LastName":
if (string.IsNullOrEmpty(LastName))
{
result = "Last name has to be set";
}
else if (LastName.Length < 5)
{
result = "Last name must be at least five characters";
}
break;
}
}

// Set return value
return result;
}
}

#endregion

在我的简单演示版本中,我将提交按钮连接到代码隐藏中的事件处理程序,该处理程序启用验证并刷新两个文本框的绑定(bind):
private void OnButtonClick(object sender, RoutedEventArgs e)
{
var contact = (Contact) DataContext;
contact.ValidationEnabled = true;
var binding = FirstNameBox.GetBindingExpression(TextBox.TextProperty);
binding.UpdateSource();
binding = LastNameBox.GetBindingExpression(TextBox.TextProperty);
binding.UpdateSource();
}

现在,在我尝试提交表单之前,不会出现红色轮廓。

真实世界:在我的生产应用程序中,我不控制业务对象,也不能像在我的简单演示中那样修改它们。因此,我为业务对象创建了一个简单的传递包装器,该包装器将要数据绑定(bind)到 View 的属性公开,并将这些属性链接到被包装的业务对象的相应属性。包装器实现 IDataErrorInfo 并包含 ValidationEnabled属性(property)。

如果未启用验证,包装器的 IDataErrorInfo 实现始终返回 null。如果启用了验证,则包装器调用被包装对象上的 IDataErrorInfo 实现并返回它从那里得到的内容。

任何使用 Model-View-ViewModel 模式的人都会熟悉这种方法。我们正在做的是为业务对象创建一个 View 模型包装器,这被许多开发人员认为是 MVVM 最佳实践。它将 UI 关注点(在页面提交之前抑制红色边框)与业务模型关注点(简单对象验证)分开。

此外,我的生产应用程序不会在代码隐藏中使用事件处理程序。根据 MVVM,按钮将连接到 ICommand,该命令将包含来自简单演示中 OnButtonClick() 处理程序的逻辑。

我希望这对其他研究此问题的人有所帮助。

关于wpf - IDataErrorInfo:验证页面何时提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2591594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com