private void AppendLookupFieldCascadeChanges(string fieldName, string recordType, List <Action <RecordEntryViewModelBase> > onChanges) { var lookupForAttributes = ObjectRecordService.GetPropertyInfo(fieldName, recordType) .GetCustomAttributes(typeof(LookupFieldCascade), true).Cast <LookupFieldCascade>(); foreach (var attribute in lookupForAttributes) { onChanges.Add( re => { var changedViewModel = re.GetFieldViewModel(fieldName); if (changedViewModel.ValueObject != null) { var changedViewModelLookup = ((LookupFieldViewModel)changedViewModel).Value; var matchingFields = re.FieldViewModels.Where(f => f.FieldName == attribute.TargetProperty); var lookupService = ObjectRecordService.GetLookupService(changedViewModel.FieldName, re.GetRecordType(), re.ParentFormReference, re.GetRecord()); if (lookupService != null) { var lookupRecord = lookupService.Get(changedViewModelLookup.RecordType, changedViewModelLookup.Id); if (lookupRecord == null) { changedViewModel.ValueObject = null; re.ApplicationController.UserMessage(string.Format("The {0} Was Not Found And The Value Has Been Cleared", changedViewModel.Label)); } else { var sourceFieldValue = lookupRecord.GetField(attribute.SourceRecordField); if (matchingFields.Any()) { matchingFields.First().ValueObject = sourceFieldValue; } } } } }); } }