private Panel CreateGroupEntityPanel(Entity entity, IEnumerable <Entity> allStates) { if (entity.Attributes.ContainsKey("hidden") && entity.Attributes["hidden"]) { return(null); } Newtonsoft.Json.Linq.JArray childrenEntityIds = entity.Attributes["entity_id"]; PanelBuilderBase customEntity = CustomEntities.FirstOrDefault(x => childrenEntityIds.Any(y => y.ToString().StartsWith(x.EntityIdStartsWith))); IEnumerable <Entity> childrenEntities = allStates.Where(s => childrenEntityIds.Any(e => e.ToString() == s.EntityId)); return(customEntity.CreateGroupPanel(entity, childrenEntities)); }
/// <summary> /// Data Update on UI Thread /// </summary> /// <param name="element"></param> /// <param name="allEntities"></param> private void UpdateChildPanelIfneeded(FrameworkElement element, IEnumerable <Entity> allEntities, IEnumerable <Entity> entitiesToUpdate = null) { PanelData panelData = PanelData.GetPanelData(element); // Only scan UI Elements which have PanelData as this signifies a panel element with data to process if (panelData != null) { if (null == entitiesToUpdate) { entitiesToUpdate = allEntities; } Entity entity = entitiesToUpdate.FirstOrDefault(x => x.EntityId == panelData.Entity.EntityId); // Some panels, such as the custom Settings panel, are not backed by entity data so skip those here if (entity != null) { Panel panel; if (entity.Attributes.ContainsKey("entity_id")) { // Update group panels Newtonsoft.Json.Linq.JArray childrenEntityIds = entity.Attributes["entity_id"]; IEnumerable <Entity> childrenEntities = allEntities.Where(s => childrenEntityIds.Any(e => e.ToString() == s.EntityId)); panel = CreateGroupEntityPanel(entity, childrenEntities); } else { // Update single panels panel = CreateChildEntityPanel(entity); } // Replace the old panel with the new panel Panel parentPanel = (Panel)VisualTreeHelper.GetParent(element); int indexOfElement = parentPanel.Children.IndexOf(element); parentPanel.Children[indexOfElement] = panel; Telemetry.TrackTrace($"Replaced Panel: {entity.EntityId}."); } } else { // Attempt to update panels with this current parent element int childCount = VisualTreeHelper.GetChildrenCount(element); for (int i = 0; i < childCount; i++) { DependencyObject obj = VisualTreeHelper.GetChild(element, i); UpdateChildPanelIfneeded((FrameworkElement)obj, entitiesToUpdate, allEntities); } } }