public static ObservableViewModel CombineViewModels(IViewModelServiceProvider serviceProvider, ModelContainer modelContainer, IEnumerable <ObservableViewModel> viewModels) { var combinedViewModel = new ObservableViewModel(serviceProvider, modelContainer); 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"); } foreach (var dirtiableViewModel in viewModel.dirtiableViewModels) { combinedViewModel.dirtiableViewModels.Add(dirtiableViewModel.Key, dirtiableViewModel.Value.ToList()); } 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"); } CombinedObservableNode rootCombinedNode = CombinedObservableNode.Create(combinedViewModel, "Root", null, typeof(object), rootNodes, null); combinedViewModel.Identifier = new ObservableViewModelIdentifier(rootNodes.Select(x => x.ModelGuid)); rootCombinedNode.Initialize(); combinedViewModel.RootNode = rootCombinedNode; return(combinedViewModel); }
private void GenerateChildren(IEnumerable <KeyValuePair <string, List <SingleObservableNode> > > commonChildren) { foreach (var children in commonChildren) { var contentType = children.Value.First().Type; var index = children.Value.First().Index; CombinedObservableNode child = Create(Owner, children.Key, this, contentType, children.Value, index); AddChild(child); child.Initialize(); } }
public static ObservableViewModel CombineViewModels(IViewModelServiceProvider serviceProvider, IReadOnlyCollection <ObservableViewModel> viewModels) { if (serviceProvider == null) { throw new ArgumentNullException(nameof(serviceProvider)); } if (viewModels == null) { throw new ArgumentNullException(nameof(viewModels)); } var combinedViewModel = new ObservableViewModel(serviceProvider); 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.", nameof(viewModels)); } viewModel.parent = combinedViewModel; combinedViewModel.children.Add(viewModel); 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.", nameof(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, Index.Empty); rootCombinedNode.Initialize(); combinedViewModel.RootNode = rootCombinedNode; return(combinedViewModel); }
private void GenerateListChildren(IEnumerable <KeyValuePair <object, List <SingleObservableNode> > > allChildren) { int currentIndex = 0; foreach (var children in allChildren) { if (!ShouldCombine(children.Value, CombinedNodes.Count, "(ListItem)", true)) { continue; } var contentType = children.Value.First().Type; var name = $"Item {currentIndex}"; CombinedObservableNode child = Create(Owner, name, this, contentType, children.Value, new Index(currentIndex)); AddChild(child); child.Initialize(); child.DisplayName = name; ++currentIndex; } }