MVVM 패턴을 사용하는 응용 프로그램이 있는데 사용자가 정보를 입력하면 유효성 검사를 구현하고 싶습니다. 예를 들어 min이 max보다 큰 경우 내보기에서 버튼을 사용하지 않으려합니다.모델에서 오류 발생시 ViewModel을 알리기
모델에 IDataErrorInfo를 구현했습니다. 여기 내 모델 :
public class MyModel : IDataErrorInfo, INotifyPropertyChanged
{
private string stock;
public string Stock
{
get { return stock; }
set { stock = value; }
}
private double min;
public double Min
{
get { return min; }
set { min = value; OnPropertyChange("Min"); }
}
private double max;
public double Max
{
get { return max; }
set { max = value; OnPropertyChange("Max"); }
}
public string Error
{
get { throw new NotImplementedException(); }
}
public string this[string columnName]
{
get
{
string error = string.Empty;
if (columnName == "Min" || columnName == "Max")
{
if (Min > Max)
{
error = "Min can't be greater than Max";
}
}
return error;
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChange(string name)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
}
그리고 내 뷰 모델은 (데이터 그리드에 바인딩) MyModel의 수집 및 CanUpdate라는 부울 속성이 있습니다. 이 CanUpdate는 내보기에서 업데이트 단추의 IsEnabled 속성에 바인딩됩니다.
public class MyViewModel : INotifyPropertyChanged
{
private ObservableCollection<MyModel> stocks;
public ObservableCollection<MyModel> Stocks
{
get { return stocks; }
set { stocks = value; }
}
private bool canUpdate = true;
public bool CanUpdate
{
get { return canUpdate; }
set { canUpdate = value; }
}
public MyViewModel()
{
AddStocks();
}
public void AddStocks()
{
Stocks = new ObservableCollection<MyModel>();
Stocks.Add(new MyModel() { Stock ="Stock 1", Min = 10, Max=20 });
Stocks.Add(new MyModel() { Stock = "Stock 2", Min = 5, Max = 15 });
Stocks.Add(new MyModel() { Stock = "Stock 3", Min = 6, Max = 25 });
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChange(string name)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
사용자는 DataGrid에서 최소값과 최대 값을 편집 할 수 있습니다. MyModel에서 발생한 오류가 MyViewModel의 CanUpdate 속성을 업데이트해야 할 때마다 편집 중입니다. 이것을 달성하도록 안내해주십시오.