/// <summary>
            ///     Property changed callback for DataContext property
            /// </summary>
            private static void OnDataContextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                // Selector has a bug regarding DataContext change and SelectedItem property,
                // where if the SelectedItem due to old DataContext is a valid item in ItemsSource
                // but the SelectedItem due to new DataContext is not a valid item in ItemsSource,
                // the SelectedIndex remains that of old context instead of changing to -1.
                // This method is a workaround to that problem, since it is of high impact to DataGrid.
                TextBlockComboBox combo = (TextBlockComboBox)d;
                bool isLocalValue       = (DependencyPropertyHelper.GetValueSource(combo, SelectedItemProperty).BaseValueSource == BaseValueSource.Local);

                if (isLocalValue)
                {
                    // Clear the selection and re-apply the binding.
                    BindingBase binding = BindingOperations.GetBindingBase(combo, SelectedItemProperty);
                    if (binding != null)
                    {
                        combo.ClearValue(SelectedItemProperty);
                        DataGridPactComboBoxColumn.ApplyBinding(binding, combo, SelectedItemProperty);
                    }
                }
                else
                {
                    // Clear the selection by setting the local value
                    // and re-evaluate the property by clearing the local value.
                    combo.SelectedItem = null;
                    combo.ClearValue(SelectedItemProperty);
                }
            }
        /// <summary>
        ///     Creates the visual tree for text based cells.
        /// </summary>
        protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
        {
            TextBlockComboBox comboBox = new TextBlockComboBox();

            ApplyStyle(/* isEditing = */ false, /* defaultToElementStyle = */ false, comboBox);
            ApplyColumnProperties(comboBox);

            return(comboBox);
        }
        protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
        {
            var comboBox = new TextBlockComboBox();

            comboBox.IsEditable = false;

            ApplyStyle(false, false, comboBox);
            ApplyColumnProperties(comboBox);

            var binding = BindingOperations.GetBinding(this, ComboBox.ItemsSourceProperty);

            ApplyBinding(binding, comboBox, ComboBoxEx.ItemsSourceExProperty);

            return(comboBox);
        }
        /// <summary>
        ///     Creates the visual tree for text based cells.
        /// </summary>
        protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
        {
            TextBlockComboBox comboBox = new TextBlockComboBox();


            // SyncProperties(textBlock);

            //ApplyStyle(/* isEditing = */ false, /* defaultToElementStyle = */ false, comboBox);
            ApplyColumnProperties(comboBox);

            return(comboBox);

            // PactComboBox textBlock = new PactComboBox();
            // textBlock.FeatureID = 1;
            //// TextBlock textBlock = new TextBlock();

            // SyncProperties(textBlock);

            //// ApplyStyle(/* isEditing = */ false, /* defaultToElementStyle = */ false, textBlock);
            // ApplyBinding(textBlock, TextBlock.TextProperty);

            // return textBlock;
        }
        /// <summary>
        ///     Creates the visual tree for text based cells.
        /// </summary>
        protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem) 
        {
            TextBlockComboBox comboBox = new TextBlockComboBox(); 
 
            ApplyStyle(/* isEditing = */ false, /* defaultToElementStyle = */ false, comboBox);
            ApplyColumnProperties(comboBox); 

            return comboBox;
        }
        /// <summary>
        ///     Creates the visual tree for text based cells.
        /// </summary>
        protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
        {
            TextBlockComboBox comboBox = new TextBlockComboBox();

               // SyncProperties(textBlock);

            //ApplyStyle(/* isEditing = */ false, /* defaultToElementStyle = */ false, comboBox);
            ApplyColumnProperties(comboBox);

            return comboBox;

               // PactComboBox textBlock = new PactComboBox();
               // textBlock.FeatureID = 1;
               //// TextBlock textBlock = new TextBlock();

               // SyncProperties(textBlock);

               //// ApplyStyle(/* isEditing = */ false, /* defaultToElementStyle = */ false, textBlock);
               // ApplyBinding(textBlock, TextBlock.TextProperty);

               // return textBlock;
        }