Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在viewmodel中检索IDataErrorInfo字符串结果_C#_Wpf_Mvvm_Idataerrorinfo - Fatal编程技术网

C# 在viewmodel中检索IDataErrorInfo字符串结果

C# 在viewmodel中检索IDataErrorInfo字符串结果,c#,wpf,mvvm,idataerrorinfo,C#,Wpf,Mvvm,Idataerrorinfo,我想知道如何从IDataErrorInfo获取字符串。这个[string propertyName]方法来自我的ViewModel 基本上,我已经在模型中创建了一个新属性,这样我就可以验证模型集合中的每一行,在我的有效性检查中,我会说它是否有效,如果无效,它将禁用viewmodel中的命令 模型 视图模型 public bool CanSave { get { if (m_ProductVersion != null &am

我想知道如何从IDataErrorInfo获取字符串。这个[string propertyName]方法来自我的ViewModel

基本上,我已经在模型中创建了一个新属性,这样我就可以验证模型集合中的每一行,在我的有效性检查中,我会说它是否有效,如果无效,它将禁用viewmodel中的命令

模型

视图模型

    public bool CanSave
    {
        get
        {
            if (m_ProductVersion != null && m_ProductVersion.ProductItems != null)
            {
                foreach (ProductItem item in m_ProductVersion.ProductItems)
                {
                    // I dont want to use isValid any more
                    if (!item.IsValid)
                        return false;
                }
            }

            return true;
        }
    }
但是如果可以的话,我想去掉isValid属性,并在viewmodel中使用来自IDataErrorInfo的结果

这能做到吗


谢谢

首先请注意,您的
有效
工作不正常。假设您有3个要验证的属性:
A
B
C
。每当您输入某个内容时,WPF通常会对
IDataErrorInfo
求值,因此假设我为
A
B
输入的内容无效。我得到一个错误,
IsValid
false
。到现在为止,一直都还不错。现在,我输入对
C
有效的内容<代码>A和
B
仍然无效,但
IsValid
现在将为true,因为上次的
IDataErrorInfo
检查产生了一个空结果

因此,您的
IsValid
只检查最后一个已验证的属性,这显然不足以进行一般有效性检查

属性
IsValid
应在返回结果之前对每个属性运行验证。大概是这样的:

public bool IsValid ()
{
    for (string propertyName in allPropertyNames)
    {
        if (!string.IsEmptyOrNull(((IDataErrorInfo)this)[propertyName]))
            return false;
    }
    return true;
}
string error = dataItem.Error;
您需要维护所有属性名称的列表,以便我们可以遍历这些名称。然后,我们将验证委托给调用
IDataErrorInfo
验证的[propertyName]。如果我们得到任何错误,该对象是无效的


因此,正如您所看到的,您可以简单地调用
IDataErrorInfo
item属性来代替单个属性检查,但是您通常希望对所有属性进行检查。

首先,请注意,
是有效的
工作不正常。假设您有3个要验证的属性:
A
B
C
。每当您输入某个内容时,WPF通常会对
IDataErrorInfo
求值,因此假设我为
A
B
输入的内容无效。我得到一个错误,
IsValid
false
。到现在为止,一直都还不错。现在,我输入对
C
有效的内容<代码>A和
B
仍然无效,但
IsValid
现在将为true,因为上次的
IDataErrorInfo
检查产生了一个空结果

因此,您的
IsValid
只检查最后一个已验证的属性,这显然不足以进行一般有效性检查

属性
IsValid
应在返回结果之前对每个属性运行验证。大概是这样的:

public bool IsValid ()
{
    for (string propertyName in allPropertyNames)
    {
        if (!string.IsEmptyOrNull(((IDataErrorInfo)this)[propertyName]))
            return false;
    }
    return true;
}
string error = dataItem.Error;
您需要维护所有属性名称的列表,以便我们可以遍历这些名称。然后,我们将验证委托给调用
IDataErrorInfo
验证的[propertyName]。如果我们得到任何错误,该对象是无效的


因此,如您所见,您可以简单地调用
IDataErrorInfo
item属性来代替单个属性检查,但您通常希望对所有属性进行检查。

我怀疑您错误地实现了
IDataErrorInfo
接口。请看一看我对关于堆栈溢出的长标题问题的回答。以这种方式设置接口(您可以忽略附加属性“Errors”等),然后您可以访问error
string
,如下所示:

public bool IsValid ()
{
    for (string propertyName in allPropertyNames)
    {
        if (!string.IsEmptyOrNull(((IDataErrorInfo)this)[propertyName]))
            return false;
    }
    return true;
}
string error = dataItem.Error;
如果像我的示例所示扩展接口的功能,则可以处理多个错误,并且可以执行以下操作:

ObservableCollection<string> errors = dataItem.Errors;

我怀疑您错误地实现了
IDataErrorInfo
接口。请看一看我对关于堆栈溢出的长标题问题的回答。以这种方式设置接口(您可以忽略附加属性“Errors”等),然后您可以访问error
string
,如下所示:

public bool IsValid ()
{
    for (string propertyName in allPropertyNames)
    {
        if (!string.IsEmptyOrNull(((IDataErrorInfo)this)[propertyName]))
            return false;
    }
    return true;
}
string error = dataItem.Error;
如果像我的示例所示扩展接口的功能,则可以处理多个错误,并且可以执行以下操作:

ObservableCollection<string> errors = dataItem.Errors;

使用此设置,当其中一个已验证控件的值被修改时,您如何使errors集合更新/重新调用自身?您好@DanNeely,请看我的链接答案。每次调用
Error
属性时,它都会检查
hasrerrors
属性,该属性调用
Errors
属性,从而再次启动整个验证过程。或者,您可以只通知正在验证的每个属性(以及每个属性)中的
Errors
集合的属性更改。使用此设置,当其中一个已验证控件的值被修改时,您如何使Errors集合更新/重新调用自身?您好@DanNeely,请查看我的链接答案。每次调用
Error
属性时,它都会检查
hasrerrors
属性,该属性调用
Errors
属性,从而再次启动整个验证过程。或者,您可以只通知正在验证的每个属性(以及每个属性)中的
错误
集合的属性更改。