private void Update() { var contextTypes = _context.GroupBy(c => c.GetType()); var requirements = model.Requirements; foreach (var contextType in contextTypes) { if (IncludeUpperBreakdown && contextType.Key == typeof(BreakdownItem)) { foreach (var item in contextType.OfType <BreakdownItem>().Where(i => i.Parent != null)) { foreach (var parent in item.Parents) { _context.Add(parent); } } } // continuous filtering refinement requirements = requirements.Where(r => contextType.Any(c => c.IsContextFor(r))); } RequirementSets = requirements.SelectMany(rs => rs.RequirementSets).Distinct() .Select(rs => new RequirementSetView(rs)) .ToList(); // requirements from sets Requirements = RequirementSets.SelectMany(rs => rs.Requirements).ToList(); // requirements used directly without property set var map = new Dictionary <int, RequirementSetView>(); var check = new HashSet <int>(Requirements.Select(r => r.PropertyTemplate.EntityLabel)); var directRequirements = requirements .SelectMany(rs => rs.Requirements) .Where(r => check.Add(r.EntityLabel) && r is IfcSimplePropertyTemplate) .Select(r => new RequirementView((IfcSimplePropertyTemplate)r, map)); // add direct properties and their parent property sets (if any) Requirements.AddRange(directRequirements); RequirementSets.AddRange(map.Values); // keep information about the primary filter LevelsOfInformationNeeded = requirements.ToList(); // notify about the change of both OnPropertyChanged(nameof(Requirements)); OnPropertyChanged(nameof(RequirementSets)); OnPropertyChanged(nameof(LevelsOfInformationNeeded)); // raise event ContextUpdatedEvent?.Invoke(this, EventArgs.Empty); }
private void Update() { Actor = selector.ContextViews.OfType <ActorView>().FirstOrDefault(); BreakdownItem = selector.ContextViews.OfType <BreakdownItemView>().FirstOrDefault(); Milestone = selector.ContextViews.OfType <MilestoneView>().FirstOrDefault(); Reason = selector.ContextViews.OfType <ReasonView>().FirstOrDefault(); OnPropertyChanged(nameof(Actor)); OnPropertyChanged(nameof(BreakdownItem)); OnPropertyChanged(nameof(Milestone)); OnPropertyChanged(nameof(Reason)); OnPropertyChanged(nameof(IsComplete)); ContextUpdatedEvent?.Invoke(this, EventArgs.Empty); }