Take a look at the implementation here. To quote from the blog post:
When validating an object, the following process is applied in
Validator.ValidateObject:
Validate property-level attributes If any validators are invalid,
abort validation returning the failure(s) Validate the object-level
attributes If any validators are invalid, abort validation returning
the failure(s) If on the desktop framework and the object implements
IValidatableObject, then call its Validate method and return any
failure(s)
If you have more complex validation needs, it is really recommended to look into FuentValidation library.