// These methods are not used, but they are very useful when developing the Design experience
#if Development
        /// <summary>
        ///     Adds a default column for each property in the data source
        /// </summary>
        public static void GenerateColumns(ModelItem dataGridModelItem, EditingContext context)
        {
            using (ModelEditingScope scope = dataGridModelItem.BeginEdit(Properties.Resources.Generate_Columns))
            {
                // Set databinding related properties
                DataGridDesignHelper.SparseSetValue(dataGridModelItem.Properties[MyPlatformTypes.DataGrid.AutoGenerateColumnsProperty], false);

                // Get the datasource
                object dataSource = dataGridModelItem.Properties[MyPlatformTypes.DataGrid.ItemsSourceProperty].ComputedValue;
                if (dataSource != null)
                {
                    foreach (ColumnInfo columnGenerationInfo in DataGridDesignHelper.GetColumnGenerationInfos(dataSource))
                    {
                        ModelItem dataGridColumn = null;

                        dataGridColumn = DataGridDesignHelper.CreateDefaultDataGridColumn(context, columnGenerationInfo);

                        if (dataGridColumn != null)
                        {
                            dataGridModelItem.Properties[MyPlatformTypes.DataGrid.ColumnsProperty].Collection.Add(dataGridColumn);
                        }
                    }
                }
                scope.Complete();
            }
        }
        private static void OnColumnIsReadOnlyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            PropertyColumnDataModel columnModel = (PropertyColumnDataModel)d;

            if (columnModel.Column != null)
            {
                DataGridDesignHelper.SparseSetValue(columnModel.Column.Properties[PlatformTypes.DataGridColumn.IsReadOnlyProperty], e.NewValue);
            }
        }
        // Set any property defaults here
        public override void InitializeDefaults(ModelItem item)
        {
            if (item != null)
            {
                DataGridDesignHelper.SparseSetValue(item.Properties[PlatformTypes.DataGrid.WidthProperty], 200.0);
                DataGridDesignHelper.SparseSetValue(item.Properties[PlatformTypes.DataGrid.HeightProperty], 200.0);

                DataGridDesignHelper.SparseSetValue(item.Properties[PlatformTypes.DataGrid.AutoGenerateColumnsProperty], false);
            }
        }
        /// <summary>
        ///     When the column changes we need to sync other properties to keep our databinding in sync.
        /// </summary>
        private void SyncColumnProperties()
        {
            if (!_isSyncing)
            {
                _isSyncing = true;
                try
                {
                    if (Column == null)
                    {
                        BindingPath    = string.Empty;
                        ColumnTypeName = string.Empty;
                        HasColumn      = false;
                    }
                    else
                    {
                        SetBindingPath();
                        ColumnTypeName = DataGridDesignHelper.GetColumnStringType(Column);
                        HasColumn      = true;

                        // We sometimes want to pull the properties from the column, and other times we want to
                        // push the models properties down to the column.
                        if (_restoreColumn)
                        {
                            DataGridDesignHelper.SparseSetValue(Column.Properties[PlatformTypes.DataGridColumn.HeaderProperty], ColumnHeader);
                            DataGridDesignHelper.SparseSetValue(Column.Properties[PlatformTypes.DataGridColumn.CanUserReorderProperty], ColumnCanUserReorder);
                            DataGridDesignHelper.SparseSetValue(Column.Properties[PlatformTypes.DataGridColumn.CanUserResizeProperty], ColumnCanUserResize);
                            DataGridDesignHelper.SparseSetValue(Column.Properties[PlatformTypes.DataGridColumn.CanUserSortProperty], ColumnCanUserSort);
                            DataGridDesignHelper.SparseSetValue(Column.Properties[PlatformTypes.DataGridColumn.IsReadOnlyProperty], ColumnIsReadOnly);
                        }
                        else
                        {
                            // Update based on what's set in the ModelItem
                            ModelProperty modelProperty = Column.Properties[PlatformTypes.DataGridColumn.HeaderProperty];
                            ColumnHeader = modelProperty.IsSet ? (string)modelProperty.ComputedValue : null;

                            modelProperty        = Column.Properties[PlatformTypes.DataGridColumn.CanUserReorderProperty];
                            ColumnCanUserReorder = modelProperty.IsSet ? (bool?)modelProperty.ComputedValue : null;

                            modelProperty       = Column.Properties[PlatformTypes.DataGridColumn.CanUserResizeProperty];
                            ColumnCanUserResize = modelProperty.IsSet ? (bool?)modelProperty.ComputedValue : null;

                            modelProperty     = Column.Properties[PlatformTypes.DataGridColumn.CanUserSortProperty];
                            ColumnCanUserSort = modelProperty.IsSet ? (bool?)modelProperty.ComputedValue : null;

                            modelProperty    = Column.Properties[PlatformTypes.DataGridColumn.IsReadOnlyProperty];
                            ColumnIsReadOnly = modelProperty.IsSet ? (bool?)modelProperty.ComputedValue : null;
                        }
                    }
                }
                finally
                {
                    _isSyncing = false;
                }
            }
        }
        private static void OnColumnHeaderPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            PropertyColumnDataModel columnModel = (PropertyColumnDataModel)d;

            if (columnModel.Column != null)
            {
                if (e.NewValue == null)
                {
                    columnModel.Column.Properties[PlatformTypes.DataGridColumn.HeaderProperty].ClearValue();
                }
                else
                {
                    DataGridDesignHelper.SparseSetValue(columnModel.Column.Properties[PlatformTypes.DataGridColumn.HeaderProperty], e.NewValue);
                }
            }
        }
 internal void OnHasColumnChanged()
 {
     EnsureSelectAllChecked();
     DataGridDesignHelper.SparseSetValue(_dataGrid.Properties[PlatformTypes.DataGrid.AutoGenerateColumnsProperty], false);
 }