public override PathMatch Matches(PathDefinitionIterator definitionSteps, PathIterator step) { if (!step.HasStep || !step.IsCollection) { return(PathMatch.Fail()); } IVMCollection parentCollection = step.Collection; step.MoveNext(); if (!step.HasStep || !step.IsProperty) { return(PathMatch.Fail()); } if (!(parentCollection.GetItemDescriptor() is TDescriptor)) { return(PathMatch.Fail()); } var itemDescriptor = parentCollection.GetItemDescriptor(); var expectedProperty = _propertySelector.GetProperty(itemDescriptor); if (expectedProperty == step.Property) { PathMatch result = PathMatch.Succeed(length: 1); PathMatch nextResult = definitionSteps.MatchesNext(step); return(PathMatch.Combine(result, nextResult)); } return(PathMatch.Fail()); }
public override PathMatch Matches(PathDefinitionIterator definitionSteps, PathIterator step) { if (!step.HasStep || !step.IsViewModel) { return(PathMatch.Fail()); } IViewModel parentViewModel = step.ViewModel; step.MoveNext(); if (!step.HasStep || !step.IsCollection) { return(PathMatch.Fail()); } if (!(parentViewModel.Descriptor is TDescriptor)) { return(PathMatch.Fail()); } var descriptor = (TDescriptor)parentViewModel.Descriptor; var collectionProperty = (IVMPropertyDescriptor)_propertySelector.GetProperty(descriptor); // HACK ATTACK if (!parentViewModel.Kernel.IsLoaded(collectionProperty)) { return(PathMatch.Fail()); } var expectedCollection = parentViewModel.Kernel.GetValue(collectionProperty); if (step.Collection == expectedCollection) { PathMatch result = PathMatch.Succeed(length: 1); PathMatch nextResult = definitionSteps.MatchesNext(step); return(PathMatch.Combine(result, nextResult)); } else { return(PathMatch.Fail()); } }
public override IViewModel[] GetDescendants( PathDefinitionIterator definitionSteps, IViewModel rootVM, bool onlyLoaded ) { var property = _propertySelector.GetProperty(rootVM.Descriptor); if (onlyLoaded && !rootVM.Kernel.IsLoaded(property)) { return(new IViewModel[0]); } var instance = rootVM.Kernel.GetValue(property); if (PropertyTypeHelper.IsViewModelCollection(property.PropertyType)) { if (instance == null) { return(new IViewModel[0]); } var collection = (IVMCollection)instance; return(((IVMCollection)instance) .Cast <IViewModel>() .SelectMany(x => definitionSteps.GetDescendantNext(x, onlyLoaded)) .ToArray()); } else if (PropertyTypeHelper.IsViewModel(property.PropertyType)) { if (instance == null) { return(new IViewModel[0]); } return(definitionSteps.GetDescendantNext((IViewModel)instance, onlyLoaded)); } throw new NotSupportedException(ExceptionTexts.GetDescaedantsWrongPropertyStepType); }