【问题标题】:How to validate properties of the objects which belongs to a collection of a ViewModel via IDataErrorInfo interface如何通过 IDataErrorInfo 接口验证属于 ViewModel 集合的对象的属性
【发布时间】:2012-07-27 19:41:44
【问题描述】:

我有一个 MyViewModel,其中包含标量属性和集合属性。

public class MyViewModel :
    System.ComponentModel.INotifyPropertyChanged,
    System.ComponentModel.IDataErrorInfo
{
    public MyViewModel()
    {
        List<SelectableObject> list = new List<SelectableObject>();
        foreach (var weekDay in System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.DayNames)
        {
            list.Add(new SelectableObject() { Name = weekDay, IsSelected = false });
        }
        WeekDays = list;
    }
    public string Catalog { get; set; }
    public DateTime CreationTime { get; set; }
    public DateTime ModificationTime { get; set; }

    public IEnumerable<SelectableObject> WeekDays { get; private set; }

    public ICommand SaveCommand { get; private set; }

    public string Error
    {
        get { return string.Empty; }
    }

    public string this[string columnName]
    {
        get
        {
            var errorResult = string.Empty;

            switch (columnName)
            {
                case "CreationTime":
                    // Validation logic
                    break;
                case "ModificationTime":
                    // Validation logic
                    break;
                default:
                    break;
            }

            return errorResult;
        }
    }
}

SelectableObject 类:

public class SelectableObject : System.ComponentModel.INotifyPropertyChanged
{
    public string Name { get; set; }
    public bool IsSelected { get; set; }
}

我想通过 SaveCommand 操作 IsEnabled 属性,并且我希望它启用,前提是没有表格上的错误。但我不知道如何验证这一点:必须至少选择一个 WeekDay。

是的,我可以监听 WeekDays 集合中每个对象的 PropertyChanged 事件,但在这种情况下,验证逻辑将与 IDataErrorInfo 界面。

这个问题有什么解决办法吗?如何将集合的验证逻辑放到 IDataErrorInfo 接口中?

【问题讨论】:

    标签: c# wpf validation mvvm idataerrorinfo


    【解决方案1】:

    只是在你的canexecute中做你的逻辑?

    视图模型:

    private DelegateCommand _save;
    
    public ICommand SaveCommand
    {
      get {return this._save ?? (this._save = new DelegateComamnd(this.MyExecuteMethod, this.MyCanExecuteMethod));}
     }
    
    private bool MyCanExecuteMethod()
    {
       return this.WeekDays.Any(x=>x.IsSelected) && string.IsNullOrWhiteSpace(this.Error);
    }
    

    ps:如果有错误,error 应该是非空的。

    【讨论】:

    • 这是唯一的方法吗?在您的情况下,我必须在工作日的 IsSelected 属性发生更改时随时提高 CanSaveCommandExecute - 所以我必须处理 PropertyChanged 事件...
    • 不不,你不必提出任何东西——wpf 会为你做这件事。我不知道您使用的是 RelayCommand 还是 DelegateCommand,但两者都有 CanExecute 方法,并且这些方法是从 wpf 中的 CommandManager 调用的。你只需要提供这个方法。试试这个。
    • 我使用 prism 库中的 DelegateCommand。因此,每次 ViewModel 上的属性发生更改时,我都必须提高 CanExecuteChanged。这是个好方法,因为我可以控制何时发起活动。
    • 我必须承认我有自己的委托命令实现,在我的 CanExecute 添加/删除中具有类似的东西:CommandManager.RequerySuggested += value;我不知道棱镜在哪里/如何处理这些行为。如果您尝试我的解决方案并且仅在一个工作日更新,您会自动更新命令/保存按钮吗?
    • Here guy 解释为什么 prism DelegateCommand 不会自动更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多