public CalendarXDayPresenter(CalendarX calendarX)
        {
            _calendar = calendarX;

            //Init items source
            _dayItems  = CreateDayItems();
            _weekNames = CreateWeekNames();

            var weeksDisplayItemsControl = new ItemsControl()
            {
                ItemTemplate = new DataTemplate()
                {
                    VisualTree = CreateWeekNameFactory(calendarX),
                },
                ItemsPanel = new ItemsPanelTemplate()
                {
                    VisualTree = CreateUniformGridFactory(1, ItemsColumns),
                },
                ItemsSource = _weekNames,
            };

            //Init items control
            var itemsControl = new ItemsControl()
            {
                ItemTemplate = new DataTemplate()
                {
                    VisualTree = CreateCalendarXItemFactory(calendarX),
                },
                ItemsPanel = new ItemsPanelTemplate()
                {
                    VisualTree = CreateUniformGridFactory(ItemsRows, ItemsColumns),
                },
                ItemsSource = _dayItems,
            };

            Grid.SetRow(itemsControl, 1);


            _grid = new Grid();
            _grid.RowDefinitions.Add(new RowDefinition()
            {
                Height = new GridLength(1, GridUnitType.Star)
            });
            _grid.RowDefinitions.Add(new RowDefinition()
            {
                Height = new GridLength(ItemsRows, GridUnitType.Star)
            });
            _grid.Children.Add(weeksDisplayItemsControl);
            _grid.Children.Add(itemsControl);

            //add to view
            AddVisualChild(_grid);
            AddLogicalChild(_grid);

            AddHandler(CalendarXItem.SelectedEvent, new RoutedEventHandler(OnCalendarXItemClicked));
        }
        private static FrameworkElementFactory CreateCalendarXItemFactory(CalendarX calendarX)
        {
            var itemFactory = new FrameworkElementFactory(typeof(CalendarXItem));

            itemFactory.SetValue(CalendarXItem.ModeProperty, CalendarXItemMode.Day);
            itemFactory.SetBinding(CalendarXItem.StyleProperty, new Binding()
            {
                Path   = new PropertyPath(CalendarX.CalendarXItemStyleProperty),
                Source = calendarX
            });
            itemFactory.SetBinding(CalendarXItem.ContentProperty, new Binding()
            {
                Path = new PropertyPath(nameof(CalendarXDayItem.DisplayName)),
            });
            itemFactory.SetBinding(CalendarXItem.VerticalContentAlignmentProperty, new Binding()
            {
                Path   = new PropertyPath(CalendarX.VerticalContentAlignmentProperty),
                Source = calendarX
            });
            itemFactory.SetBinding(CalendarXItem.HorizontalContentAlignmentProperty, new Binding()
            {
                Path   = new PropertyPath(CalendarX.HorizontalContentAlignmentProperty),
                Source = calendarX
            });
            itemFactory.SetBinding(CalendarXItem.IsSelectedProperty, new Binding()
            {
                Path = new PropertyPath(nameof(CalendarXDayItem.IsSelected)),
            });
            itemFactory.SetBinding(CalendarXItem.IsInSelectionRangeProperty, new Binding()
            {
                Path = new PropertyPath(nameof(CalendarXDayItem.IsInSelectionRange)),
            });
            itemFactory.SetBinding(CalendarXItem.IsSpecialDayProperty, new Binding()
            {
                Path = new PropertyPath(nameof(CalendarXDayItem.IsSpecialDay)),
            });
            itemFactory.SetBinding(CalendarXItem.IsWeakenDisplayProperty, new Binding()
            {
                Path = new PropertyPath(nameof(CalendarXDayItem.IsWeakenDisplay)),
            });
            itemFactory.SetBinding(CalendarXItem.IsTodayProperty, new Binding()
            {
                Path = new PropertyPath(nameof(CalendarXDayItem.IsToday)),
            });
            return(itemFactory);
        }
        private static FrameworkElementFactory CreateWeekNameFactory(CalendarX calendarX)
        {
            var textFactory = new FrameworkElementFactory(typeof(TextBlock));

            textFactory.SetBinding(TextBlock.TextProperty, new Binding()
            {
                Path = new PropertyPath(nameof(CalendarXDayItem.DisplayName)),
            });
            textFactory.SetBinding(TextBlock.VerticalAlignmentProperty, new Binding()
            {
                Path   = new PropertyPath(CalendarX.VerticalContentAlignmentProperty),
                Source = calendarX
            });
            textFactory.SetBinding(TextBlock.HorizontalAlignmentProperty, new Binding()
            {
                Path   = new PropertyPath(CalendarX.HorizontalContentAlignmentProperty),
                Source = calendarX
            });
            return(textFactory);
        }