我正在寻找如何从 ViewModel 的 IDataErrorInfo.this[string propertyName] 方法中获取字符串。
基本上,我在模型中创建了一个新属性,因此我可以验证模型集合中的每一行,并且在我的验证检查中,我会说它是否有效,如果不是,它将在我的 View 模型中禁用该命令
模型
string IDataErrorInfo.this[string propertyName]
{
get
{
// Vaildation logic
if (result != string.Empty)
{
IsValid = false;
}
else
{
IsValid = true;
}
return result;
}
View 模型
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 属性,并使用 View 模型中 IDataErrorInfo 的结果。
这可以做到吗?
谢谢
最佳答案
首先请注意,您的 IsValid
无法正常工作。假设您有 3 个要验证的属性:A
, B
和 C
. WPF 通常评估 IDataErrorInfo
每当您输入某些内容时,想象一下我输入的内容对于 A
无效和 B
.我得到一个错误和 IsValid
将是 false
.到现在为止还挺好。现在,我输入对 C
有效的内容. A
和 B
仍然无效,但 IsValid
现在将是真的——因为最后一个 IDataErrorInfo
检查产生了一个空的结果。
所以你的IsValid
只检查最后一个被验证的属性,这对于一般的有效性检查来说绝对是不够的。
一处房产IsValid
应该在返回结果之前对每个属性运行验证。像这样的东西:
public bool IsValid ()
{
for (string propertyName in allPropertyNames)
{
if (!string.IsEmptyOrNull(((IDataErrorInfo)this)[propertyName]))
return false;
}
return true;
}
您需要维护所有属性名称的列表,以便我们可以遍历它们。然后我们将验证委托(delegate)给
this[propertyName]
调用 IDataErrorInfo
验证。如果我们得到任何错误,则该对象无效。因此,如您所见,您可以简单地调用
IDataErrorInfo
来替换单个属性检查。 item 属性,但您通常希望检查所有属性。
关于c# - 在 View 模型中检索 IDataErrorInfo 字符串结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23340561/