private void Children_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            switch (e.Action)
            {
            case System.Collections.Specialized.NotifyCollectionChangedAction.Add:
                e.NewItems.ForEach(x =>
                {
                    var comp = (DashboardComponent)x;
                    DashboardViewBase elem = GetNewViewFor(comp);
                    if (elem == null)
                    {
                        return;                    //DEBUG
                    }
                    viewBindings.Add(comp, elem);
                    AddView(elem);
                });
                break;

            case System.Collections.Specialized.NotifyCollectionChangedAction.Remove:
                e.OldItems.ForEach(x =>
                {
                    var comp = (DashboardComponent)x;
                    RemoveView(viewBindings[comp]);
                    viewBindings.Remove(comp);
                });
                break;

            case System.Collections.Specialized.NotifyCollectionChangedAction.Replace:
                e.OldItems.ForEach(x =>
                {
                    var comp = (DashboardComponent)x;
                    RemoveView(viewBindings[comp]);
                    viewBindings.Remove(comp);
                });
                e.NewItems.ForEach(x =>
                {
                    var comp = (DashboardComponent)x;
                    DashboardViewBase elem = GetNewViewFor(comp);
                    viewBindings.Add(comp, elem);
                    AddView(elem);
                });
                break;

            case System.Collections.Specialized.NotifyCollectionChangedAction.Reset:
                viewBindings.Clear();
                ClearView();
                Component.Children.ForEach(x =>
                {
                    DashboardViewBase elem = GetNewViewFor(x);
                    if (elem == null)
                    {
                        return;                    //DEBUG
                    }
                    viewBindings.Add(x, elem);
                    AddView(elem);
                });
                break;
            }
        }
        protected override void AddView(DashboardViewBase element)
        {
            var tab = new TabItem();

            tab.Tag     = element;
            tab.Content = element;
            Binding binding = new Binding("Name");

            binding.Source = element.DataContext;
            tab.SetBinding(TabItem.HeaderProperty, binding);
            root.Items.Add(tab);
        }
 protected override void RemoveView(DashboardViewBase element)
 {
     for (int i = root.Items.Count - 1; i >= 0; i--)
     {
         if (root.Items[i] is TabItem item)
         {
             if (item.Tag == element)
             {
                 root.Items.RemoveAt(i);
             }
         }
     }
 }
 protected override void RemoveView(DashboardViewBase element)
 {
     root.Children.Remove(element);
 }
 protected override void AddView(DashboardViewBase element)
 {
     root.Children.Add(element);
 }
 protected abstract void RemoveView(DashboardViewBase element);
 protected abstract void AddView(DashboardViewBase element);