コード例 #1
0
        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());
        }
コード例 #2
0
        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());
            }
        }
コード例 #3
0
        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);
        }