public void InitViewModels ()
		{
			_matrixControl = new MatrixControl (this);
			cnvMatrix.Content = _matrixControl;
			ViewModel.SetMatrixControl (_matrixControl);
		}
        void OnZxNavRecieved(MatrixControl sender, string zxName)
        {
            foreach (var s in Segments.Where(s => s.Key > 0))
            {

                var existItem = s.Value.NavItems.FirstOrDefault(x => x.Title == zxName);
                if (existItem != null)
                {
                    if (s.Value.SelectedItem == null || s.Value.Status != NavSegmentStatus.Current)
                    {
                        s.Value.SelectedItem = existItem;

                        OnNavMenuClick(s.Value, new NavMenuEventArgs()
                        {
                            CurrentLevel = s.Value.CurrentLevel,
                            CurrentSelectedId = existItem.Id
                        });
                    }
                }
            }
        }
		public void SetMatrixControl (MatrixControl control)
		{
			_matrixControl = control;
		}
        public void DrawMatrix(TreeMapRootGroup data)
        {
            if (_inProgress)
                return;

            _rootCanvas.Children.Clear ();

            if (data != null && data.children != null && data.children.Any ()) {
                data.SetPrimaryValue (GetPrimaryPropertyName (), GetColorValuePropertyName (), GetRValuePropertyName ());

                _inProgress = true;

                var groupItemsValues = data.children.Select (gr => new MatrixInputData () {
                    ParentId = gr.name,
                    ChildValues = gr.children.Select (ch => ch.PrimaryValue.Value).ToArray ()
                });

                var groupRects = SquarifiedAlgorithm.CalculateRectangles (groupItemsValues, new Size (Width - 2, Height));

                _parentView.SetZxRects (groupRects);

                var matrixList = new List<View> ();

                foreach (var rect in groupRects) {
                    var existGroup = data.children.FirstOrDefault (gr => rect.ParentId == gr.name);
                    if (existGroup != null) {
                        if (existGroup.children.Any ()) {
                            var matrixCell = new MatrixControl (_parentView) {
                                HeightRequest = rect.Height,
                                WidthRequest = rect.Width
                            };
                            matrixCell.GroupTitle = existGroup.text;
                            matrixCell.Children = existGroup.children;

                            matrixList.Add (matrixCell);
                            var boundsRect = new Rectangle (rect.X, rect.Y, rect.Width, rect.Height);

                            AbsoluteLayout.SetLayoutBounds (matrixCell, boundsRect);

                            _rootCanvas.Children.Add (matrixCell);
                        }
                    }
                }

                foreach (var m in matrixList.OfType<MatrixControl>()) {
                    m.CalculateChildrenRect (m.Children);
                    m.DrawMatrix (m.Children);
                }

                _inProgress = false;
            }
        }