public static ObservableViewModel CombineViewModels(IViewModelServiceProvider serviceProvider, ModelContainer modelContainer, IReadOnlyCollection<ObservableViewModel> viewModels) { if (viewModels == null) throw new ArgumentNullException("viewModels"); var combinedViewModel = new ObservableViewModel(serviceProvider, modelContainer, viewModels.SelectMany(x => x.Dirtiables)); var rootNodes = new List<ObservableModelNode>(); foreach (var viewModel in viewModels) { if (!(viewModel.RootNode is SingleObservableNode)) throw new ArgumentException(@"The view models to combine must contains SingleObservableNode.", "viewModels"); viewModel.parent = combinedViewModel; var rootNode = (ObservableModelNode)viewModel.RootNode; rootNodes.Add(rootNode); } if (rootNodes.Count < 2) throw new ArgumentException(@"Called CombineViewModels with a collection of view models that is either empty or containt just a single item.", "viewModels"); // Find best match for the root node type var rootNodeType = rootNodes.First().Root.Type; if (rootNodes.Skip(1).Any(x => x.Type != rootNodeType)) rootNodeType = typeof(object); CombinedObservableNode rootCombinedNode = CombinedObservableNode.Create(combinedViewModel, "Root", null, rootNodeType, rootNodes, null); combinedViewModel.Identifier = new ObservableViewModelIdentifier(rootNodes.Select(x => x.ModelGuid)); rootCombinedNode.Initialize(); combinedViewModel.RootNode = rootCombinedNode; return combinedViewModel; }
/// <summary> /// Initializes a new instance of the <see cref="DefaultModelBuilder"/> class that can be used to construct a model for a data object. /// </summary> /// <param name="modelContainer"></param> public DefaultModelBuilder(ModelContainer modelContainer) { ModelContainer = modelContainer; PrimitiveTypes = new List<Type>(); AvailableCommands = new List<INodeCommand>(); ContentFactory = new DefaultContentFactory(); }
/// <summary> /// Initializes a new instance of the <see cref="ObservableViewModel"/> class. /// </summary> /// <param name="serviceProvider">A service provider that can provide a <see cref="IDispatcherService"/> and an <see cref="ObservableViewModelService"/> to use for this view model.</param> /// <param name="modelContainer">A <see cref="ModelContainer"/> to use to build view model nodes.</param> /// <param name="modelNode">The root model node of the view model to generate.</param> /// <param name="dirtiables">The list of <see cref="IDirtiableViewModel"/> objects linked to this view model.</param> public ObservableViewModel(IViewModelServiceProvider serviceProvider, ModelContainer modelContainer, IModelNode modelNode, IEnumerable<IDirtiableViewModel> dirtiables) : this(serviceProvider, modelContainer, dirtiables.SafeArgument("dirtiables").ToList()) { if (modelNode == null) throw new ArgumentNullException("modelNode"); var node = observableViewModelService.ObservableNodeFactory(this, "Root", modelNode.Content.IsPrimitive, modelNode, new ModelNodePath(modelNode), modelNode.Content.Type, null); Identifier = new ObservableViewModelIdentifier(node.ModelGuid); node.Initialize(); RootNode = node; node.CheckConsistency(); }
/// <summary> /// Initializes a new instance of the <see cref="ObservableViewModel"/> class. /// </summary> /// <param name="serviceProvider">A service provider that can provide a <see cref="IDispatcherService"/> and an <see cref="ObservableViewModelService"/> to use for this view model.</param> /// <param name="modelContainer">A <see cref="ModelContainer"/> to use to build view model nodes.</param> /// <param name="dirtiables">The list of <see cref="IDirtiableViewModel"/> objects linked to this view model.</param> private ObservableViewModel(IViewModelServiceProvider serviceProvider, ModelContainer modelContainer, IEnumerable<IDirtiableViewModel> dirtiables) : base(serviceProvider) { if (modelContainer == null) throw new ArgumentNullException("modelContainer"); if (dirtiables == null) throw new ArgumentNullException("dirtiables"); this.modelContainer = modelContainer; this.dirtiables = dirtiables; this.dirtiables.ForEach(x => x.DirtinessUpdated += DirtinessUpdated); observableViewModelService = serviceProvider.Get<ObservableViewModelService>(); Logger = GlobalLogger.GetLogger(DefaultLoggerName); }
public ModelNodeCommandWrapper(IViewModelServiceProvider serviceProvider, INodeCommand nodeCommand, string observableNodePath, ObservableViewModel owner, ModelNodePath nodePath, IEnumerable<IDirtiableViewModel> dirtiables) : base(serviceProvider, dirtiables) { if (nodeCommand == null) throw new ArgumentNullException(nameof(nodeCommand)); if (owner == null) throw new ArgumentNullException(nameof(owner)); NodePath = nodePath; // Note: the owner should not be stored in the command because we want it to be garbage collectable Identifier = owner.Identifier; ModelContainer = owner.ModelContainer; NodeCommand = nodeCommand; Service = serviceProvider.Get<ObservableViewModelService>(); ObservableNodePath = observableNodePath; }