public void Init()
        {
            if (!string.IsNullOrEmpty(DropField) && Parent.AvailableDocuments != null && Parent.AvailableDocuments.Count > 0)
            {
                var document = Parent.AvailableDocuments.FirstOrDefault(t => t.Model.Guid == Parent.Model.DocumentGuid);
                if (document != null && BaseVM.AvailableFields != null && BaseVM.AvailableFields.Any())
                {
                    var field = BaseVM.AvailableFields.FirstOrDefault(f => f.SystemName == document.Model.DetailObject);

                    if (field != null && field.StepList.Any(s => s is CrossRefRequiredStepEdit))
                    {
                        var requiredStep =
                            (CrossRefRequiredStepEdit)field.StepList.FirstOrDefault(s => s is CrossRefRequiredStepEdit);

                        if (requiredStep != null && requiredStep.CrossRefProcessId.HasValue)
                        {
                            var localsubfields = Model.Subfields.OrderBy(f => f.Level).ToArray();

                            foreach (var subfield in localsubfields)
                            {
                                var vm = new APQPDragAndDropOptionFieldViewModel();
                                vm.Initialize(subfield, this);
                                Subfields.Add(vm);
                            }

                            if (Subfields.Count > 0)
                            {
                                DataTriggerSourceFieldsRetriever.BeginGetSourceFields(
                                     requiredStep.Process.SystemName,
                                     string.Join(".", Model.Subfields.OrderBy(f => f.Level).Select(f => f.FieldSystemName ?? string.Empty)) + "." + DropField,
                                     (newsender, e) =>
                                     {
                                         if (e.Object != null && e.Object.AvailableFields != null)
                                             SetAvailableFields(e.Object.AvailableFields);
                                         else
                                             SetAvailableFields(new Dictionary<string, MobileObservableCollection<FieldInfo>>());
                                     });
                            }
                            else SetAvailableFields(new Dictionary<string, MobileObservableCollection<FieldInfo>>());
                        }
                    }
                }
            }
        }
        /// <summary>
        /// The add subfield after.
        /// </summary>
        /// <param name="fieldViewModel">
        /// The field view model.
        /// </param>
        public void AddSubfieldAfter(APQPDragAndDropOptionFieldViewModel fieldViewModel)
        {
            var sourceField = fieldViewModel.GetSelectedField();

            if (sourceField == null)
                return;

            var subfield = APQPDragAndDropOptionFieldEdit.NewSourceField();
            subfield.Level = Model.Subfields.Count > 0 ? Model.Subfields.Max(f => f.Level) + 1 : 1;
            Model.Subfields.Add(subfield);

            var vm = new APQPDragAndDropOptionFieldViewModel();
            vm.Initialize(subfield, this);
            Subfields.Add(vm);
            RaisePropertyChanged(() => Subfields);

            FieldList.BeginGetCrossReferenceSubfields(
                sourceField.DefinedIn,
                sourceField.SystemName,
                (sender, e) =>
                {
                    if (e.Error != null)
                        return;

                    vm.SetAvailableFields(e.Object);
                });
        }
        /// <summary>
        /// The remove subfields after.
        /// </summary>
        /// <param name="field">
        /// The field.
        /// </param>
        public void RemoveSubfieldsAfter(APQPDragAndDropOptionFieldViewModel field)
        {
            var position = Subfields.IndexOf(field);

            for (var i = Subfields.Count - 1; i > position; --i)
            {
                Model.Subfields.Remove(Subfields[i].Model);
                Subfields.RemoveAt(i);
                RaisePropertyChanged(() => Subfields);
            }
        }
        /// <summary>
        /// The add subfield.
        /// </summary>
        public void AddSubfield()
        {
            if (!string.IsNullOrEmpty(DropField) && BaseVM.AvailableDropFields != null
                && BaseVM.AvailableDropFields.Any())
            {
                var sourceField = BaseVM.AvailableDropFields.FirstOrDefault(f => f.SystemName == DropField);

                if (sourceField == null) return;

                var subfield = APQPDragAndDropOptionFieldEdit.NewSourceField();
                Model.Subfields.Add(subfield);

                var vm = new APQPDragAndDropOptionFieldViewModel();
                vm.Initialize(subfield, this);
                Subfields.Add(vm);
                RaisePropertyChanged(() => Subfields);

                FieldList.BeginGetCrossReferenceSubfields(
                    sourceField.DefinedIn,
                    sourceField.SystemName,
                    (sender, e) =>
                    {
                        if (e.Error != null) return;

                        vm.SetAvailableFields(e.Object);
                    });
            }
        }