2012-07-30 55 views
0

我有一个MyViewModel,它包含标量属性和集合属性。如何通过IDataErrorInfo接口验证属于ViewModel集合的对象的属性

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

我想操纵<巴顿/ 的IsEnabled财产>通过SaveCommand,我想它会启用,只有当没有错误的形式。但我无法弄清楚如何验证这一点:至少需要选择一个WeekDay。

是的,我可以听的PropertyChanged事件平日集合中的每个对象的,但在这种情况下,验证逻辑将从IDataErrorInfo的接口分开。

有没有解决这个问题的方法?如何将集合的验证逻辑添加到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:错误应该是非空,如果有任何错误。

+0

这是唯一的方法吗?在你的情况下,我必须在平日的IsSelected属性发生变化时随时提出CanSaveCommandExecute - 所以我必须处理PropertyChanged事件... – stukselbax 2012-07-30 07:54:25

+0

不,不,你不必提出任何事情 - wpf为你做这件事。我不知道你是否使用RelayCommand或DelegateCommand,但都有一个CanExecute方法,这些方法是从wpf中的CommandManager调用的。你只需要提供这种方法。试试看。 – blindmeis 2012-07-30 08:09:20

+0

我使用棱镜库中的DelegateCommand。所以每次更改ViewModel的属性时,我都必须提高CanExecuteChanged。它的好方法,因为我控制着提升事件的时刻。 – stukselbax 2012-07-30 08:21:24

相关问题