MVVM - 在视图模型中的字段更改时验证模型
MVVM - Validating the model when a field in the viewmodel is changed
我将 MVVMLight 库与数据库优先 EF 模型一起使用。当我的视图模型中的某个字段发生变化时,我不太清楚如何验证模型。当我在 set 方法中调用 Validate
更新模型的各个属性时,这很好用。我不确定这在其他地方是如何工作的。
例如,我的应用程序中有一个 Person
class(模型),在视图模型中有一个名为 Name
的 属性 实现方式:
private Person _currentPerson;
// Code omitted...
[Required(ErrorMessage = "Name is a required field.")]
public string Name
{
get { return _currentPerson.Name; }
set
{
if (value != _currentPerson.Name)
{
_currentPerson.Name = value;
RaisePropertyChanged();
Validate(_currentPerson.Name);
}
}
}
当我想创建一个新人时,我有一个方法附加到一个名为 NewPerson
的 RelayCommand
,代码如下:
public RelayCommand NewCommand { get { return _newCommand ?? (_newCommand = new RelayCommand(NewPerson)); } }
// Code omitted...
private void NewPerson()
{
_currentPerson = new Person();
RaisePropertyChanged(String.Empty); // Updates model and UI.
}
我现在如何在不对每个 属性 调用 Validate
的情况下验证 _currentPerson
?因为这个模型class有相当多的属性...(30+).
我唯一尝试过的是使用反射来遍历 Person
对象的所有属性,但这一直导致我不太理解的异常。
更新:
设法让一些东西工作,但必须有更好的方法来做到这一点:
private void NewPerson()
{
_currentPerson = new Person();
RaisePropertyChanged(String.Empty); // Updates model and UI.
ValidatePerson(_currentPerson);
}
private void ValidatePerson(Person p)
{
Validate(p.Forename, "Forename");
Validate(p.Surname, "Surname");
Validate(p.DateOfBirth, "DateOfBirth");
// There's about another 30 calls to Validate here...
}
如何在我们的 Validate() 方法中验证整个 person 对象,而不仅仅是单个 属性?
如果您想通过 属性 单独验证逻辑,只需添加一个单独的验证所有方法,以便在整个模型需要检查时使用。这可以调用您的个人方法或执行更多定制的事情。
我将 MVVMLight 库与数据库优先 EF 模型一起使用。当我的视图模型中的某个字段发生变化时,我不太清楚如何验证模型。当我在 set 方法中调用 Validate
更新模型的各个属性时,这很好用。我不确定这在其他地方是如何工作的。
例如,我的应用程序中有一个 Person
class(模型),在视图模型中有一个名为 Name
的 属性 实现方式:
private Person _currentPerson;
// Code omitted...
[Required(ErrorMessage = "Name is a required field.")]
public string Name
{
get { return _currentPerson.Name; }
set
{
if (value != _currentPerson.Name)
{
_currentPerson.Name = value;
RaisePropertyChanged();
Validate(_currentPerson.Name);
}
}
}
当我想创建一个新人时,我有一个方法附加到一个名为 NewPerson
的 RelayCommand
,代码如下:
public RelayCommand NewCommand { get { return _newCommand ?? (_newCommand = new RelayCommand(NewPerson)); } }
// Code omitted...
private void NewPerson()
{
_currentPerson = new Person();
RaisePropertyChanged(String.Empty); // Updates model and UI.
}
我现在如何在不对每个 属性 调用 Validate
的情况下验证 _currentPerson
?因为这个模型class有相当多的属性...(30+).
我唯一尝试过的是使用反射来遍历 Person
对象的所有属性,但这一直导致我不太理解的异常。
更新: 设法让一些东西工作,但必须有更好的方法来做到这一点:
private void NewPerson()
{
_currentPerson = new Person();
RaisePropertyChanged(String.Empty); // Updates model and UI.
ValidatePerson(_currentPerson);
}
private void ValidatePerson(Person p)
{
Validate(p.Forename, "Forename");
Validate(p.Surname, "Surname");
Validate(p.DateOfBirth, "DateOfBirth");
// There's about another 30 calls to Validate here...
}
如何在我们的 Validate() 方法中验证整个 person 对象,而不仅仅是单个 属性?
如果您想通过 属性 单独验证逻辑,只需添加一个单独的验证所有方法,以便在整个模型需要检查时使用。这可以调用您的个人方法或执行更多定制的事情。