WPF:Datagrid验证不在行级别,而是在集合级别

问题描述 投票:-1回答:1

我有一个实现某些验证规则的数据网格。如果这些错误返回该行无效,则将该行标记为错误(行标题中的红色图标)。基本的东西。

现在,我想对整个集合实施验证规则。例如,我有一列显示每个源集合项的名称,并且我希望该名称在整个集合中是唯一的。当三行显示一个共享的命名时,我希望它们全部在行标题中显示红色错误图标。

我曾考虑过在修改此名称属性时在模型的类中引发一个事件,然后从视图模型中侦听此事件,但是在编写代码时感觉不对。而且我不知道我是否可以实现结果(将行标记为错误)。

还有更好的方法吗?

wpf validation datagrid
1个回答
0
投票

好吧,这就是我最后要做的,如果这很脏,不当行为,请告诉我。

public class MyModel : IDataErrorInfo
{
    #region Fields

    readonly ObservableCollection<MyModel> _parentCollection;

    #endregion

    #region Properties

    public string Name { get; set; }

    #endregion

    #region Validation
    string _error;
    public string Error => _error;
    public string this[string columnName]
    {
        get
        {
            List<string> foundErrors = new List<string>();
            if (string.IsNullOrWhiteSpace(columnName) ||
                (columnName == nameof(Name) &&
                 _parentCollection.Count(ed => ed.Name == Name) > 1))
            {
                foundErrors.Add("Name already used"));
            }
            _error = string.Join(Environment.NewLine, foundErrors);
            return _error;
        }
    }

    #endregion

    #region Constructor

    public EvaluationDay(ObservableCollection<MyModel> parentCollection)
        : base()
    {
        _parentCollection = parentCollection;
    }

    #endregion

    }
}

然后,在ViewModel中,每当我向绑定到视图的可观察集合中添加MyModel对象时,我都要确保将OC引用作为对象的构造函数发送给该对象:

public class MyViewModel
{
    #region Properties

    public ObservableCollection<MyModel> MyModels { get; set; }

    #endregion

    ...

    int elementsToAddCount = 10;
    for (int i = 0; i < elementsToAddCount; i++)
    {
        MyModels.Add(new MyModel(MyModels));
    }

    ...

话虽如此,您也可以简单地向验证规则添加参数...

© www.soinside.com 2019 - 2024. All rights reserved.