diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/CollectionEditor.xaml.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/CollectionEditor.xaml.cs index 596a2959..a853333f 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/CollectionEditor.xaml.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/CollectionEditor.xaml.cs @@ -17,16 +17,6 @@ namespace Microsoft.Windows.Controls.PropertyGrid.Editors InitializeComponent(); } - public void Attach(PropertyItem propertyItem) - { - _item = propertyItem; - } - - public FrameworkElement ResolveEditor() - { - return this; - } - private void Button_Click(object sender, RoutedEventArgs e) { CollectionEditorDialog editor = new CollectionEditorDialog(_item.PropertyType); @@ -36,5 +26,11 @@ namespace Microsoft.Windows.Controls.PropertyGrid.Editors BindingOperations.SetBinding(editor, CollectionEditorDialog.ItemsSourceProperty, binding); editor.ShowDialog(); } + + public FrameworkElement ResolveEditor(PropertyItem propertyItem) + { + _item = propertyItem; + return this; + } } } diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ComboBoxEditor.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ComboBoxEditor.cs index 20b8537d..a0d995ad 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ComboBoxEditor.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ComboBoxEditor.cs @@ -10,10 +10,10 @@ namespace Microsoft.Windows.Controls.PropertyGrid.Editors ValueProperty = ComboBox.SelectedItemProperty; } - public override void Attach(PropertyItem propertyItem) + protected override void ResolveValueBinding(PropertyItem propertyItem) { SetItemsSource(propertyItem); - base.Attach(propertyItem); + base.ResolveValueBinding(propertyItem); } protected abstract IList CreateItemsSource(PropertyItem propertyItem); diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ITypeEditor.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ITypeEditor.cs index 43cf6259..9c2bf820 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ITypeEditor.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ITypeEditor.cs @@ -4,7 +4,6 @@ namespace Microsoft.Windows.Controls.PropertyGrid.Editors { public interface ITypeEditor { - void Attach(PropertyItem propertyItem); - FrameworkElement ResolveEditor(); + FrameworkElement ResolveEditor(PropertyItem propertyItem); } } diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/PrimitiveTypeCollectionEditor.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/PrimitiveTypeCollectionEditor.cs index 6ae810cd..4204d2ae 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/PrimitiveTypeCollectionEditor.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/PrimitiveTypeCollectionEditor.cs @@ -15,11 +15,11 @@ namespace Microsoft.Windows.Controls.PropertyGrid.Editors ValueProperty = Microsoft.Windows.Controls.PrimitiveTypeCollectionEditor.ItemsSourceProperty; } - public override void Attach(PropertyItem propertyItem) + protected override void ResolveValueBinding(PropertyItem propertyItem) { Editor.ItemsSourceType = propertyItem.PropertyType; Editor.ItemType = propertyItem.PropertyType.GetGenericArguments()[0]; - base.Attach(propertyItem); + base.ResolveValueBinding(propertyItem); } } } diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/TypeEditor.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/TypeEditor.cs index aa4e8eef..b6ba781d 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/TypeEditor.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/TypeEditor.cs @@ -14,26 +14,14 @@ namespace Microsoft.Windows.Controls.PropertyGrid.Editors #endregion //Properties - #region Constructors + #region ITypeEditor Members - public TypeEditor() + public virtual FrameworkElement ResolveEditor(PropertyItem propertyItem) { Editor = new T(); SetValueDependencyProperty(); SetControlProperties(); - } - - #endregion //Constructors - - #region ITypeEditor Members - - public virtual void Attach(PropertyItem propertyItem) - { ResolveValueBinding(propertyItem); - } - - public virtual FrameworkElement ResolveEditor() - { return Editor; } @@ -64,7 +52,6 @@ namespace Microsoft.Windows.Controls.PropertyGrid.Editors protected abstract void SetValueDependencyProperty(); - #endregion //Methods } } diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyGrid.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyGrid.cs index bea7aac4..ea2c8c8a 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyGrid.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyGrid.cs @@ -32,7 +32,7 @@ namespace Microsoft.Windows.Controls.PropertyGrid get { return (ContextMenu)GetValue(AdvancedOptionsMenuProperty); } set { SetValue(AdvancedOptionsMenuProperty, value); } } - + #endregion //AdvancedOptionsMenu #region CustomTypeEditors @@ -406,70 +406,8 @@ namespace Microsoft.Windows.Controls.PropertyGrid }; propertyItem.SetBinding(PropertyItem.ValueProperty, binding); - ITypeEditor editor = null; - - //check for custom editor - if (CustomTypeEditors.Count > 0) - { - //first check if the custom editor is type based - ICustomTypeEditor customEditor = CustomTypeEditors[propertyItem.PropertyType]; - if (customEditor == null) - { - //must be property based - customEditor = CustomTypeEditors[propertyItem.Name]; - } - - if (customEditor != null) - editor = customEditor.Editor; - } - - try - { - //no custom editor found - if (editor == null) - { - if (propertyItem.IsReadOnly) - editor = new TextBlockEditor(); - else if (propertyItem.PropertyType == typeof(bool) || propertyItem.PropertyType == typeof(bool?)) - editor = new CheckBoxEditor(); - else if (propertyItem.PropertyType == typeof(decimal) || propertyItem.PropertyType == typeof(decimal?)) - editor = new DecimalUpDownEditor(); - else if (propertyItem.PropertyType == typeof(double) || propertyItem.PropertyType == typeof(double?)) - editor = new DoubleUpDownEditor(); - else if (propertyItem.PropertyType == typeof(int) || propertyItem.PropertyType == typeof(int?)) - editor = new IntegerUpDownEditor(); - else if (propertyItem.PropertyType == typeof(DateTime) || propertyItem.PropertyType == typeof(DateTime?)) - editor = new DateTimeUpDownEditor(); - else if ((propertyItem.PropertyType == typeof(Color))) - editor = new ColorEditor(); - else if (propertyItem.PropertyType.IsEnum) - editor = new EnumComboBoxEditor(); - else if (propertyItem.PropertyType == typeof(FontFamily) || propertyItem.PropertyType == typeof(FontWeight) || propertyItem.PropertyType == typeof(FontStyle) || propertyItem.PropertyType == typeof(FontStretch)) - editor = new FontComboBoxEditor(); - else if (propertyItem.PropertyType.IsGenericType) - { - if (propertyItem.PropertyType.GetInterface("IList") != null) - { - var t = propertyItem.PropertyType.GetGenericArguments()[0]; - if (!t.IsPrimitive && !t.Equals(typeof(String))) - editor = new Microsoft.Windows.Controls.PropertyGrid.Editors.CollectionEditor(); - else - editor = new Microsoft.Windows.Controls.PropertyGrid.Editors.PrimitiveTypeCollectionEditor(); - } - else - editor = new TextBlockEditor(); - } - else - editor = new TextBoxEditor(); - } - } - catch (Exception ex) - { - //TODO: handle this some how - } - - editor.Attach(propertyItem); - propertyItem.Editor = editor.ResolveEditor(); + ITypeEditor editor = GetTypeEditor(propertyItem); + propertyItem.Editor = editor.ResolveEditor(propertyItem); return propertyItem; } @@ -532,5 +470,81 @@ namespace Microsoft.Windows.Controls.PropertyGrid } #endregion //Methods + + + private ITypeEditor GetTypeEditor(PropertyItem propertyItem) + { + ITypeEditor editor = null; + + editor = CreateCustomEditor(propertyItem, CustomTypeEditors); + + if (editor == null) + editor = CreateDefaultEditor(propertyItem); + + return editor; + } + + private ITypeEditor CreateCustomEditor(PropertyItem propertyItem, CustomTypeEditorCollection customTypeEditors) + { + ITypeEditor editor = null; + + //check for custom editor + if (customTypeEditors.Count > 0) + { + //first check if the custom editor is type based + ICustomTypeEditor customEditor = customTypeEditors[propertyItem.PropertyType]; + if (customEditor == null) + { + //must be property based + customEditor = customTypeEditors[propertyItem.Name]; + } + + if (customEditor != null) + editor = customEditor.Editor; + } + + return editor; + } + + private ITypeEditor CreateDefaultEditor(PropertyItem propertyItem) + { + ITypeEditor editor = null; + + if (propertyItem.IsReadOnly) + editor = new TextBlockEditor(); + else if (propertyItem.PropertyType == typeof(bool) || propertyItem.PropertyType == typeof(bool?)) + editor = new CheckBoxEditor(); + else if (propertyItem.PropertyType == typeof(decimal) || propertyItem.PropertyType == typeof(decimal?)) + editor = new DecimalUpDownEditor(); + else if (propertyItem.PropertyType == typeof(double) || propertyItem.PropertyType == typeof(double?)) + editor = new DoubleUpDownEditor(); + else if (propertyItem.PropertyType == typeof(int) || propertyItem.PropertyType == typeof(int?)) + editor = new IntegerUpDownEditor(); + else if (propertyItem.PropertyType == typeof(DateTime) || propertyItem.PropertyType == typeof(DateTime?)) + editor = new DateTimeUpDownEditor(); + else if ((propertyItem.PropertyType == typeof(Color))) + editor = new ColorEditor(); + else if (propertyItem.PropertyType.IsEnum) + editor = new EnumComboBoxEditor(); + else if (propertyItem.PropertyType == typeof(FontFamily) || propertyItem.PropertyType == typeof(FontWeight) || propertyItem.PropertyType == typeof(FontStyle) || propertyItem.PropertyType == typeof(FontStretch)) + editor = new FontComboBoxEditor(); + else if (propertyItem.PropertyType.IsGenericType) + { + if (propertyItem.PropertyType.GetInterface("IList") != null) + { + var t = propertyItem.PropertyType.GetGenericArguments()[0]; + if (!t.IsPrimitive && !t.Equals(typeof(String))) + editor = new Microsoft.Windows.Controls.PropertyGrid.Editors.CollectionEditor(); + else + editor = new Microsoft.Windows.Controls.PropertyGrid.Editors.PrimitiveTypeCollectionEditor(); + } + else + editor = new TextBlockEditor(); + } + else + editor = new TextBoxEditor(); + + return editor; + } } }