The first thing I notice is that you have the same long conditional in at least three places: FatherSBloodGroup, MothersBloodGroup, and DonorsBloodGroup all conatin teh same chunk of code in the setter:
if (string.IsNullOrEmpty(value) || (value != "A+" && value != "A-" && value != "B+" && value != "B-" && value != "AB+"
&& value != "AB-" && value != "O+" && value != "O-"))
throw new Exception("Please enter a valid blood group");
else
I'd move that into a method which returns a bool to indicate "valid" or "invalid", and I'd also move the strings into an array rather than checking in code:
private readonly string[] bloodGroups = { "A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-" };
private bool IsValidBloodGroup(string group)
{
foreach (string s in bloodGroups)
{
if (group == s) return true;
}
return false;
}
If you are going to throw exceptions to indicate input errors, you should catch them - if I (as a user) entered all the info and miskeyed the final blood group, I'd be...annoyed...when the application crashed and lost me what I'd typed.
You should follow naming conventions for property bases: the MothersBloodGroup property should store into info in _MothersBloodGroup not mothersBloodGroup
You need to be more careful when typing names: FatherSBloodGroup shouldn;t have a capital "S" in it.
When you get info from the user, try to keep related info together: user details (all), then Fathers, then the Mothers. Makes it easier for the user to concentrate. And don't ask the user to "Enter your first name:" and then ask him to "Enter your donor's blood group:" - you will confuse his as to exactly what you mean.
It would be a good idea to allow users to not know a parent's blood group: I have no idea what my parents groups were - and can't ask since they are no longer with us.