c# - 在 View 模型中检索 IDataErrorInfo 字符串结果

标签 c# wpf mvvm idataerrorinfo

我正在寻找如何从 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 , BC . WPF 通常评估 IDataErrorInfo每当您输入某些内容时,想象一下我输入的内容对于 A 无效和 B .我得到一个错误和 IsValid将是 false .到现在为止还挺好。现在,我输入对 C 有效的内容. AB仍然无效,但 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/

相关文章:

wpf - 数据绑定(bind) : Different triggers for different purposes

c# - 从 ViewModel 打开/关闭 View

c# - Razor @Html.ValidationMessageFor() 不显示 "validation error message"

c# - 用于后续加载的 Javascript 事件,例如 window.onload

wpf - 愚蠢的 F#\WPF 错误 - 命名空间 "The Name ' 中不存在 'xyz' abc',即使 Intellisense 看到它

c# - VS2013 : Memory profiler doesn't show anything on a specific project

c# - 更新绑定(bind)进度条

ios - VIPER 的可重用 View /模块

c# - 尝试使用JSON.NET和DataContractJsonSerializer反序列化JSON失败

c# - log4net AdoNetAppender 中的记录延迟?