2012-07-30 4 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 클래스 : 나는 < 버튼의 의 IsEnabled 부동산/를 통해 >을 SaveCommand를 조작 할, 나는 그것이 경우에만 사용 가능합니다 원하는

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

가 양식에 오류가 없습니다. 그러나 이것을 검증하는 방법을 알아낼 수는 없습니다 : 최소 1 주일을 선택해야했습니다.

예,들을 수는 평일 컬렉션의 모든 개체의 이벤트를하여 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

유일한 방법은이 방법입니까? 귀하의 경우 나는 CanSaveCommandExecute 언제든지 평일의 IsSelected 속성 변경 - 그래서 PropertyChanged 이벤트를 처리 할 필요가 제기 ... – stukselbax

+0

아니 아니 당신이 아무것도 인상하지 않아도 - wpf 당신을 위해이 일을. 나는 당신이 RelayCommand 또는 DelegateCommand를 사용하는지 모르지만 둘 다 CanExecute 메소드가 있고이 메소드는 wpf의 CommandManager에서 호출됩니다. 이 방법을 제공하면됩니다. 이걸 시험해 봐. – blindmeis

+0

프리즘 라이브러리에서 DelegateCommand를 사용합니다. 그래서 ViewModel에서 속성이 변경 될 때마다 CanExecuteChanged를 발생시켜야합니다. 그 좋은 방법, 왜냐하면 나는 이벤트를 일으킬 순간을 제어하고 있기 때문이다. – stukselbax