private static CellEditor GetCellEditor(object key)
        {
            var resource = default(CellEditor);

            if (!DefaultCellEditorSelector.TryGetCellEditor(key, out resource))
            {
                throw new KeyNotFoundException("Resource not found");
            }

            return(resource);
        }
        private static bool TryGetResource(object key, out object value)
        {
            value = null;

            var dispatcher = Dispatcher.CurrentDispatcher;

            if (dispatcher == null)
            {
                return(false);
            }

            var target = default(DefaultCellEditorSelector);

            lock ((( ICollection )s_instances).SyncRoot)
            {
                for (int i = s_instances.Count - 1; i >= 0; i--)
                {
                    var instance = s_instances[i].Target as DefaultCellEditorSelector;

                    if (instance == null)
                    {
                        s_instances.RemoveAt(i);
                    }
                    else if (instance.Dispatcher == dispatcher)
                    {
                        target = instance;

                        // We could exit the loop but we don't because we want to clean up the list
                        // and keep it small.  We don't want it to become large with lots of empty
                        // WeakReference.
                        //break;
                    }
                }

                if (target == null)
                {
                    target = new DefaultCellEditorSelector();
                    s_instances.Add(new WeakReference(target));
                }

                // We keep a strong reference on the target instance to prevent that instance
                // from being garbage collected.  We assume that we will need that instance
                // again for other calls.  We don't want to have to create a new instance to
                // query for a single resource.
                s_instance = target;
            }

            Debug.Assert(target != null);

            value = target.TryFindResource(key);

            return(value != null);
        }
        private static CellEditor TryFreeze(CellEditor editor)
        {
            if ((editor != null) && !editor.IsFrozen)
            {
                DefaultCellEditorSelector.TrySeal(editor.EditTemplate);

                if (editor.CanFreeze)
                {
                    editor.Freeze();
                }
            }

            return(editor);
        }
        private static bool TryGetCellEditor(object key, out CellEditor value)
        {
            var resource = default(object);

            if (!DefaultCellEditorSelector.TryGetResource(key, out resource))
            {
                value = default(CellEditor);
                return(false);
            }
            else
            {
                value = DefaultCellEditorSelector.TryFreeze(resource as CellEditor);
                return(value != null);
            }
        }
        private static bool TryGetDataTemplate(object key, out DataTemplate value)
        {
            var resource = default(object);

            if (!DefaultCellEditorSelector.TryGetResource(key, out resource))
            {
                value = default(DataTemplate);
                return(false);
            }
            else
            {
                value = DefaultCellEditorSelector.TrySeal(resource as DataTemplate);
                return(value != null);
            }
        }
        public static CellEditor SelectCellEditor(Type dataType)
        {
            if (dataType == null)
            {
                return(null);
            }

            if (dataType.IsGenericType && (dataType.GetGenericTypeDefinition() == typeof(Nullable <>)))
            {
                dataType = Nullable.GetUnderlyingType(dataType);
            }

            var editor = default(CellEditor);

            if (DefaultCellEditorSelector.TryGetCellEditor(dataType.FullName, out editor))
            {
                return(editor);
            }

            return(null);
        }
        public static CellEditor SelectCellEditor(Type dataType)
        {
            CellEditor cellEditor = null;

            if (dataType != null)
            {
                if ((dataType.IsGenericType) && (dataType.GetGenericTypeDefinition() == typeof(Nullable <>)))
                {
                    dataType = Nullable.GetUnderlyingType(dataType);
                }

                cellEditor = DefaultCellEditorSelector.ThreadSafeTryFindResource(dataType.FullName) as CellEditor;

                if (cellEditor != null)
                {
                    DefaultCellEditorSelector.ThreadSafeTryFreezeEditor(cellEditor);
                }
            }

            return(cellEditor);
        }
 static DefaultCellEditorSelector()
 {
   Instance = new DefaultCellEditorSelector();
 } 
 static DefaultCellEditorSelector()
 {
     Instance = new DefaultCellEditorSelector();
 }