void Children_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
 {
     if (e.OldItems != null)
     {
         foreach (var item in e.OldItems)
         {
             var model = (item as TileMenuItemViewModel);
             var view  = _childernMenuItemViews.FirstOrDefault(v => v.DataContext == model);
             if (MenuCanvas.Children.Contains(view))
             {
                 view.Dispose();
                 MenuCanvas.Children.Remove(view);
             }
         }
     }
     else if (e.NewItems != null)
     {
         foreach (var item in e.NewItems)
         {
             var model = (item as TileMenuItemViewModel);
             TileMenuItemView menutItemView = new TileMenuItemView()
             {
                 DataContext = model
             };
             _childernMenuItemViews.Add(menutItemView);
         }
     }
     updateChildrenTargetPositions();
 }
        private void MenuItemView_DataContextChanged(FrameworkElement sender, DataContextChangedEventArgs args)
        {
            TileMenuItemViewModel model = (TileMenuItemViewModel)DataContext;

            model.PropertyChanged            -= model_PropertyChanged;
            model.Children.CollectionChanged -= Children_CollectionChanged;
            model.PropertyChanged            += model_PropertyChanged;
            model.Children.CollectionChanged += Children_CollectionChanged;

            // initialize children
            foreach (var oldChildrenViews in _childernMenuItemViews)
            {
                oldChildrenViews.Dispose();
                if (MenuCanvas != null && MenuCanvas.Children.Contains(oldChildrenViews))
                {
                    MenuCanvas.Children.Remove(oldChildrenViews);
                }
            }
            _childernMenuItemViews.Clear();
            foreach (var menuItemViewModel in model.Children)
            {
                TileMenuItemView menutItemView = new TileMenuItemView()
                {
                    DataContext = menuItemViewModel
                };
                _childernMenuItemViews.Add(menutItemView);
            }
            updateChildrenTargetPositions();


            if (model.TileMenuContentViewModel == null)
            {
                this.Visibility = Visibility.Collapsed;
            }
            else
            {
                if (model.TileMenuContentViewModel is InputFieldViewTileMenuContentViewModel)
                {
                    mainGrid.Children.Clear();
                    mainGrid.Children.Add(new AttributeFieldView()
                    {
                        DataContext =
                            ((InputFieldViewTileMenuContentViewModel)model.TileMenuContentViewModel).AttributeTransformationViewModel
                    });
                }
                else if (model.TileMenuContentViewModel is OperationTypeTileMenuContentViewModel)
                {
                    mainGrid.Children.Clear();
                    mainGrid.Children.Add(new OperationTypeView()
                    {
                        DataContext =
                            ((OperationTypeTileMenuContentViewModel)model.TileMenuContentViewModel).OperationTypeModel
                    });
                }
                else if (model.TileMenuContentViewModel is OperationTypeGroupTileMenuContentViewModel)
                {
                    mainGrid.Children.Clear();
                    mainGrid.Children.Add(new OperationTypeView()
                    {
                        DataContext =
                            ((OperationTypeGroupTileMenuContentViewModel)model.TileMenuContentViewModel).OperationTypeGroupModel
                    });
                }
                else if (model.TileMenuContentViewModel is InputGroupViewTileMenuContentViewModel)
                {
                    mainGrid.Children.Clear();
                    mainGrid.Children.Add(new AttributeGroupView()
                    {
                        DataContext =
                            ((InputGroupViewTileMenuContentViewModel)model.TileMenuContentViewModel).InputGroupViewModel
                    });
                }
            }
        }