首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVVM -验证

MVVM -验证
EN

Stack Overflow用户
提问于 2010-11-11 07:54:04
回答 2查看 9.9K关注 0票数 17

我们试图在mvvm中找到验证,在业务逻辑或模型中进行验证。我已经在业务逻辑中实现了类型--这里可以找到一个简化的图表:

如果我们有很多相互独立的输入,没有问题,异常会抛出,文本框会捕捉到它的标记,每个错误输入的边框都是红色的。然而,当我们有了依赖的价值,我们就有麻烦了。例如:

模型中的

  • Value1和Value2不能相同,因此我们在每个寻找相等值的用户中都有一个验证函数,如果现在发生了
  • ,则抛出一个异常,如果我们将Value1设置为0,将Value2设置为1,那么在GUI中将
  • Value1设置为1->这个值会被标记为红色,因为其他值的验证不会被触发,所以GUI中的Value2没有被标记为错误的
  • Value2在GUI中被设置为2,现在我们已经达到了一个有效的状态,但是只有Value2被验证了,因此,Value1仍然被标记为故障

是否有一个共同的模式来解决这个问题?我们不想在两个文本框之间的GUI中引入依赖项,因为这个逻辑应该只存在于业务逻辑层。

除了实现validate之外,还可以实现IDataErrorInfo接口,但问题仍然存在,因此无法强制依赖值再次验证它们的值,至少我看不到:)

任何帮助都是非常感谢的。

干杯,曼尼

清除,删除必要的步骤

15.11.2010 - Part2

好吧,重新考虑一下,我们要用商业逻辑层。下面是我们当前计划的配置:

(这里的图像有点小,请在一个单独的窗口上打开它,显示它的大小)一切或多或少都很清楚,除了如果业务逻辑下的数据模型发生了变化,如何通知不同编辑器的所有视图模型/模型克隆。一种方法是跟踪创建它们的业务逻辑中的克隆模型。当使用业务逻辑commit()更改数据模型时,所有其他已注册模型克隆都可以被通知并进一步传播。或者,业务逻辑可以发布所有视图模型都订阅的事件,这样它们也可以得到更改--有人能给我一个提示吗?还有什么更好呢?

再次感谢你的帮助,对不起我被困住了;)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-11 08:57:02

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

  • 以符合MVVM的方式执行验证,
  • 为任何特定字段进行自定义验证(如果需要,验证可以检查多个值)
  • 将用户界面绑定到验证错误

您可以在视图模型上(甚至在视图模型库中实现IDataErrorInfo,并在派生的视图模型中重写它)。由于数据绑定的性质,我需要检查的值都在视图模型中,我可以测试它们的任何组合。当然,您的业务层中仍然有您的验证,但是您不再需要仅仅为了进行一些验证而访问您的业务层(或模型)。

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

C#代码:

代码语言:javascript
复制
    #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标记(特别是ValidatesOnDataErrors绑定中的ValidatesOnExceptionsText属性):

代码语言:javascript
复制
<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"  
         />
票数 15
EN

Stack Overflow用户

发布于 2015-08-21 20:03:03

有一个共同的模式来解决这个问题吗?我们不想在两个文本框之间的GUI中引入依赖项,因为这个逻辑应该只存在于业务逻辑层。

  1. Value1Value2是相互依存的,因为“模型中的Value1和Value2是不一样的”。
  2. --这意味着当Value2发生变化时,Value1也会发生变化,也会发生相反的变化!实际上,当statement.
  3. Value1更改时,Value1验证结果会发生变化,但这与以前的Value2设置器必须同时通知Value1Value2属性更改有关。
  4. 视图必须重新读取和重新验证两个值并清除错误标记。
  5. 不确定如果发现已引发通知事件但实际值没有变化,
  6. 不确定WPF是否会这样做。H 223G 224
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4152346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档