C# MVVM-在viewmodel中的字段更改时验证模型

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

我将MVVMLight库与数据库优先EF模型一起使用。当viewmodel中的某个字段发生更改时,我不太明白如何验证模型。当我在set方法中调用
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中。