C# 在viewmodel中检索IDataErrorInfo字符串结果
我想知道如何从IDataErrorInfo获取字符串。这个[string propertyName]方法来自我的ViewModel 基本上,我已经在模型中创建了一个新属性,这样我就可以验证模型集合中的每一行,在我的有效性检查中,我会说它是否有效,如果无效,它将禁用viewmodel中的命令 模型 视图模型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
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”等),然后您可以访问errorstring
,如下所示:
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”等),然后您可以访问errorstring
,如下所示:
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
属性,从而再次启动整个验证过程。或者,您可以只通知正在验证的每个属性(以及每个属性)中的错误集合的属性更改。