gpt4 book ai didi

c# - MVVM - 验证

转载 作者:可可西里 更新时间:2023-11-01 03:09:57 24 4
gpt4 key购买 nike

我们正试图找出在业务逻辑或模型中执行验证的 mvvm 中的验证。我已经在我们的业务逻辑中实现了通过异常类型进行验证 - 可以在此处找到简化图: alt text

如果我们有很多彼此独立的输入,没有问题,抛出异常,文本框捕获它并标记每个错误输入的边框为红色。然而,当我们有依赖值时,我们就有麻烦了。例如

  • 模型中的 Value1 和 Value2 不能相同,因此我们在每个寻找相等值的对象中都有一个验证函数,如果发生这种情况则抛出异常

  • 现在,如果我们将 Value1 设置为 0 并将 Value2 设置为 1,一切都很好

  • Value1 在 GUI 中被设置为 1 --> 这个被标记为红色,因为没有触发其他值的验证,所以 GUI 中的 Value2 没有被标记为错误

  • Value2 在 GUI 中设置为 2,现在我们已达到有效状态,但只有 Value2 得到验证,因此 Value1 仍被标记为错误

是否有解决该问题的通用模式?我们不想在两个文本框之间的 GUI 中引入依赖关系,因为该逻辑应该只出现在业务逻辑层中。

除了实现异常验证之外,还可以实现 IDataErrorInfo 接口(interface),但问题仍然存在,没有办法强制依赖值再次验证它们的值,至少我看不到:)

感谢任何帮助

干杯, 曼尼


[清理,删除不必要的步骤]


15.11.2010 - 第 2 部分

好吧,在这里重新考虑一下,我们将使用业务逻辑层。这是我们目前计划的配置: alt text(图片在这里有点小,请在单独的窗口打开它以显示全尺寸)一切都或多或少很清楚,除了如果业务逻辑下的数据模型发生更改,如何通知不同编辑器的所有 View 模型/模型克隆。一种方法是在创建它们的业务逻辑中跟踪克隆的模型。当使用业务逻辑 commit() 更改数据模型时,可以将更改通知所有其他已注册模型克隆并进一步传播它们。或者,业务逻辑可以发布一个所有 View 模型都订阅的事件,以便它们也能获得更改 - 谁能给我一个更好的提示?

再次感谢您的帮助,抱歉我脑子有问题;)

最佳答案

您可以考虑使用 System.ComponentModel.IDataErrorInfo界面。这个非常方便的界面使您能够:

  • 以符合 MVVM 的方式进行验证
  • 对任何特定字段进行自定义验证(如果需要,验证可以检查多个值)
  • 将您的 UI 绑定(bind)到验证错误

您在您的 View 模型上实现 IDataErrorInfo(或者甚至在您的 View 模型库中虚拟地实现 IDataErrorInfo,并在您的派生 View 模型中覆盖它)。由于数据绑定(bind)的性质,我需要检查的值都在 View 模型中,我可以测试它们的任意组合。当然,您仍然在业务层进行验证,但您不再需要为了进行一些验证而前往业务层(或模型)。

这是一个来自 (WPF) 屏幕的简单示例,它收集一些用户详细信息并对它们进行基本验证:

C#代码:

    #region IDataErrorInfo Members

/// <summary>
/// Gets an error message indicating what is wrong with this object.
/// </summary>
/// <value></value>
/// <returns>An error message indicating what is wrong with this object. The default is an empty string ("").</returns>
public override string Error
{
get
{
return this["UserCode"] + this["UserName"] + this["Password"] + this["ConfirmedPassword"] + this["EmailAddress"];
}
}

/// <summary>
/// Gets the <see cref="System.String"/> with the specified column name.
/// </summary>
/// <value></value>
public override string this[string columnName]
{
get
{
switch (columnName)
{
case "UserCode":
if (!string.IsNullOrEmpty(UserCode) && UserCode.Length > 20)
return "User Code must be less than or equal to 20 characters";
break;

case "UserName":
if (!string.IsNullOrEmpty(UserCode) && UserCode.Length > 60)
return "User Name must be less than or equal to 60 characters";
break;

case "Password":
if (!string.IsNullOrEmpty(Password) && Password.Length > 60)
return "Password must be less than or equal to 60 characters";
break;

case "ConfirmedPassword":
if (Password != ConfirmedPassword)
return Properties.Resources.ErrorMessage_Password_ConfirmedPasswordDoesntMatch;
break;

case "EmailAddress":
if (!string.IsNullOrEmpty(EmailAddress))
{
var r = new Regex(_emailRegex);
if (!r.IsMatch(EmailAddress))
return Properties.Resources.ErrorMessage_Email_InvalidEmailFormat;
}
break;
}
return string.Empty;
}
}

#endregion

这是页面上两个文本框的 XAML 标记(特别注意 Text 绑定(bind)中的 ValidatesOnDataErrorsValidatesOnExceptions 属性):

<TextBox Name="UserCodeTextBox" 
Text="{Binding UserCode,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=True,
ValidatesOnExceptions=True,
NotifyOnSourceUpdated=True,
NotifyOnTargetUpdated=True}"
GotFocus="Input_GotFocus"
VerticalAlignment="Top"
Margin="165,0,150,0"
CharacterCasing="Upper"
/>

<TextBox Name="UserNameTextBox"
Text="{Binding UserName,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=True,
ValidatesOnExceptions=True,
NotifyOnSourceUpdated=True,
NotifyOnTargetUpdated=True}"
GotFocus="Input_GotFocus"
VerticalAlignment="Top"
Margin="165,30,0,0"
/>

关于c# - MVVM - 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4152346/

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