【问题标题】:WPF: Datagrid validation not on a row level but on a collection levelWPF:数据网格验证不是在行级别,而是在集合级别
【发布时间】:2019-11-22 08:02:47
【问题描述】:

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

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

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

有没有更好的办法?

【问题讨论】:

    标签: wpf validation datagrid


    【解决方案1】:

    好的,这就是我最终做的事情,请让我知道这是否肮脏、不好的做法等。

    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));
        }
    
        ...
    

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

    【讨论】:

      猜你喜欢
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      • 1970-01-01
      • 2019-05-28
      • 2018-10-20
      • 1970-01-01
      • 2018-03-23
      相关资源
      最近更新 更多