C# MVVM-在viewmodel中的字段更改时验证模型
我将MVVMLight库与数据库优先EF模型一起使用。当viewmodel中的某个字段发生更改时,我不太明白如何验证模型。当我在set方法中调用C# MVVM-在viewmodel中的字段更改时验证模型,c#,wpf,validation,mvvm,ef-database-first,C#,Wpf,Validation,Mvvm,Ef Database First,我将MVVMLight库与数据库优先EF模型一起使用。当viewmodel中的某个字段发生更改时,我不太明白如何验证模型。当我在set方法中调用Validate时,当我更新模型的各个属性时,这可以很好地工作。我不确定这在其他地方是如何起作用的 例如,我的应用程序中有一个Person类(模型),在视图模型中实现了一个名为Name的属性: private Person _currentPerson; // Code omitted... [Required(ErrorMessage = "Na
Validate
时,当我更新模型的各个属性时,这可以很好地工作。我不确定这在其他地方是如何起作用的
例如,我的应用程序中有一个Person
类(模型),在视图模型中实现了一个名为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);
}
}
}
当我想创建一个新人时,我有一个方法附加到RelayCommand
上,名为NewPerson
,代码如下:
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.
}
我现在如何验证\u currentPerson
,而无需对每个属性调用validate
?因为这个模型类有很多属性。。。(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对象,而不仅仅是单个属性如何?验证Validate()方法中的整个person对象,而不仅仅是单个属性如何?如果需要按属性单独验证逻辑,只需在整个模型需要检查时添加一个单独的Validate all方法。它可以调用您的单个方法或执行更定制的操作。如果您希望按属性单独验证逻辑,只需在整个模型需要检查时添加一个单独的validate all方法。它可以调用您的单个方法或执行更定制的操作。这不起作用,我得到以下异常:
其他信息:“PersonViewModel”类型不包含名为“ValidatePerson”的公共属性。
修复了它,需要使用重载方法来防止该异常。这不起作用,我得到以下异常:其他信息:“PersonViewModel”类型不包含名为“ValidatePerson”的公共属性。
修复了它,需要使用重载方法来防止该异常。这不起作用,我得到以下异常:附加信息:“PersonViewModel”类型不包含名为“ValidatePerson”的公共属性。
修复了它,需要使用重载方法来防止该异常。我是将此方法放在viewmodel中还是放在模型中,将validate方法添加到my viewmodel会抛出一个带有消息的ArgumentException
,类型“PersonViewModel”不包含名为“ValidatePerson”的公共属性。
考虑到您已经标记了一个可接受的答案,这两种方法都有效。如果您想在其他地方获得该逻辑,请将其放入模型中。如果验证特定于在该上下文中使用的模型,则将其放在viewmodel中。我是将此方法放在viewmodel中还是放在模型中,将validate方法添加到my viewmodel会抛出一个带有消息的ArgumentException
,类型“PersonViewModel”不包含名为“ValidatePerson”的公共属性。
考虑到您已经标记了一个可接受的答案,这两种方法都有效。如果您想在其他地方获得该逻辑,请将其放入模型中。如果验证特定于在该上下文中使用的模型,则将其放在viewmodel中。我是将此方法放在viewmodel中还是放在模型中,将validate方法添加到my viewmodel会抛出一个带有消息的ArgumentException
,类型“PersonViewModel”不包含名为“ValidatePerson”的公共属性。
考虑到您已经标记了一个可接受的答案,这两种方法都有效。如果您想在其他地方获得该逻辑,请将其放入模型中。如果验证特定于在该上下文中使用的模型,则将其放在viewmodel中。