From 2523b237d23010c32175fa5c0a10be605136c85e Mon Sep 17 00:00:00 2001 From: brianlagunas_cp Date: Mon, 26 Sep 2011 18:42:42 +0000 Subject: [PATCH] PropertyGrid BREAKING CHANGES - renamed CustomTypeEditors to EditorDefinitions. Added ability to add custom editors by declaring a DataTemplate. You can target a Type or a list of PropertyNames. Example: --- ...ustomTypeEditor.cs => EditorDefinition.cs} | 7 +- ...ction.cs => EditorDefinitionCollection.cs} | 7 +- .../Editors/DecimalUpDownEditor.cs | 5 + .../Editors/DoubleUpDownEditor.cs | 5 + .../Editors/ICustomTypeEditor.cs | 12 -- .../Editors/IntegerUpDownEditor.cs | 4 + .../Implementation/IEditorDefinition.cs | 13 ++ .../Implementation/PropertyGrid.cs | 171 +++++++++--------- .../Implementation/PropertyItem.cs | 20 +- ...ollection.cs => PropertyItemCollection.cs} | 8 +- .../WPFToolkit.Extended.csproj | 8 +- 11 files changed, 145 insertions(+), 115 deletions(-) rename ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/{Editors/CustomTypeEditor.cs => EditorDefinition.cs} (61%) rename ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/{CustomTypeEditorCollection.cs => EditorDefinitionCollection.cs} (69%) delete mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ICustomTypeEditor.cs create mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/IEditorDefinition.cs rename ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/{PropertyCollection.cs => PropertyItemCollection.cs} (78%) diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/CustomTypeEditor.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorDefinition.cs similarity index 61% rename from ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/CustomTypeEditor.cs rename to ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorDefinition.cs index 36ac5730..3752ab24 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/CustomTypeEditor.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorDefinition.cs @@ -1,11 +1,12 @@ using System.Collections.Generic; using System; +using System.Windows; -namespace Microsoft.Windows.Controls.PropertyGrid.Editors +namespace Microsoft.Windows.Controls.PropertyGrid { - public class CustomTypeEditor : ICustomTypeEditor + public class EditorDefinition : IEditorDefinition { - public ITypeEditor Editor { get; set; } + public DataTemplate EditorTemplate { get; set; } private IList _properties = new List(); public IList Properties diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/CustomTypeEditorCollection.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorDefinitionCollection.cs similarity index 69% rename from ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/CustomTypeEditorCollection.cs rename to ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorDefinitionCollection.cs index 585ba312..456c39b7 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/CustomTypeEditorCollection.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorDefinitionCollection.cs @@ -1,12 +1,11 @@ using System; using System.Collections.ObjectModel; -using Microsoft.Windows.Controls.PropertyGrid.Editors; namespace Microsoft.Windows.Controls.PropertyGrid { - public class CustomTypeEditorCollection : ObservableCollection + public class EditorDefinitionCollection : ObservableCollection { - public ICustomTypeEditor this[string propertyName] + public IEditorDefinition this[string propertyName] { get { @@ -20,7 +19,7 @@ namespace Microsoft.Windows.Controls.PropertyGrid } } - public ICustomTypeEditor this[Type targetType] + public IEditorDefinition this[Type targetType] { get { diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/DecimalUpDownEditor.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/DecimalUpDownEditor.cs index 7e8e9e28..5f4c69c6 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/DecimalUpDownEditor.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/DecimalUpDownEditor.cs @@ -4,6 +4,11 @@ namespace Microsoft.Windows.Controls.PropertyGrid.Editors { public class DecimalUpDownEditor : TypeEditor { + protected override void SetControlProperties() + { + Editor.BorderThickness = new System.Windows.Thickness(0); + } + protected override void SetValueDependencyProperty() { ValueProperty = DecimalUpDown.ValueProperty; diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/DoubleUpDownEditor.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/DoubleUpDownEditor.cs index 28551aea..ccace41e 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/DoubleUpDownEditor.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/DoubleUpDownEditor.cs @@ -4,6 +4,11 @@ namespace Microsoft.Windows.Controls.PropertyGrid.Editors { public class DoubleUpDownEditor : TypeEditor { + protected override void SetControlProperties() + { + Editor.BorderThickness = new System.Windows.Thickness(0); + } + protected override void SetValueDependencyProperty() { ValueProperty = DoubleUpDown.ValueProperty; diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ICustomTypeEditor.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ICustomTypeEditor.cs deleted file mode 100644 index 241d944c..00000000 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ICustomTypeEditor.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Microsoft.Windows.Controls.PropertyGrid.Editors -{ - public interface ICustomTypeEditor - { - ITypeEditor Editor { get; set; } - IList Properties { get; set; } - Type TargetType { get; set; } - } -} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/IntegerUpDownEditor.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/IntegerUpDownEditor.cs index fede0db8..631a7788 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/IntegerUpDownEditor.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/IntegerUpDownEditor.cs @@ -4,6 +4,10 @@ namespace Microsoft.Windows.Controls.PropertyGrid.Editors { public class IntegerUpDownEditor : TypeEditor { + protected override void SetControlProperties() + { + Editor.BorderThickness = new System.Windows.Thickness(0); + } protected override void SetValueDependencyProperty() { ValueProperty = IntegerUpDown.ValueProperty; diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/IEditorDefinition.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/IEditorDefinition.cs new file mode 100644 index 00000000..90b64fd2 --- /dev/null +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/IEditorDefinition.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Windows; + +namespace Microsoft.Windows.Controls.PropertyGrid +{ + public interface IEditorDefinition + { + DataTemplate EditorTemplate { get; set; } + IList Properties { get; set; } + Type TargetType { get; set; } + } +} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyGrid.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyGrid.cs index ea2c8c8a..636d721a 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyGrid.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyGrid.cs @@ -35,17 +35,6 @@ namespace Microsoft.Windows.Controls.PropertyGrid #endregion //AdvancedOptionsMenu - #region CustomTypeEditors - - public static readonly DependencyProperty CustomTypeEditorsProperty = DependencyProperty.Register("CustomTypeEditors", typeof(CustomTypeEditorCollection), typeof(PropertyGrid), new UIPropertyMetadata(new CustomTypeEditorCollection())); - public CustomTypeEditorCollection CustomTypeEditors - { - get { return (CustomTypeEditorCollection)GetValue(CustomTypeEditorsProperty); } - set { SetValue(CustomTypeEditorsProperty, value); } - } - - #endregion //CustomTypeEditors - #region DisplaySummary public static readonly DependencyProperty DisplaySummaryProperty = DependencyProperty.Register("DisplaySummary", typeof(bool), typeof(PropertyGrid), new UIPropertyMetadata(true)); @@ -57,6 +46,17 @@ namespace Microsoft.Windows.Controls.PropertyGrid #endregion //DisplaySummary + #region EditorDefinitions + + public static readonly DependencyProperty EditorDefinitionsProperty = DependencyProperty.Register("EditorDefinitions", typeof(EditorDefinitionCollection), typeof(PropertyGrid), new UIPropertyMetadata(new EditorDefinitionCollection())); + public EditorDefinitionCollection EditorDefinitions + { + get { return (EditorDefinitionCollection)GetValue(EditorDefinitionsProperty); } + set { SetValue(EditorDefinitionsProperty, value); } + } + + #endregion //EditorDefinitions + #region Filter public static readonly DependencyProperty FilterProperty = DependencyProperty.Register("Filter", typeof(string), typeof(PropertyGrid), new UIPropertyMetadata(null, OnFilterChanged)); @@ -117,10 +117,10 @@ namespace Microsoft.Windows.Controls.PropertyGrid #region Properties - public static readonly DependencyProperty PropertiesProperty = DependencyProperty.Register("Properties", typeof(PropertyCollection), typeof(PropertyGrid), new UIPropertyMetadata(null)); - public PropertyCollection Properties + public static readonly DependencyProperty PropertiesProperty = DependencyProperty.Register("Properties", typeof(PropertyItemCollection), typeof(PropertyGrid), new UIPropertyMetadata(null)); + public PropertyItemCollection Properties { - get { return (PropertyCollection)GetValue(PropertiesProperty); } + get { return (PropertyItemCollection)GetValue(PropertiesProperty); } private set { SetValue(PropertiesProperty, value); } } @@ -406,77 +406,14 @@ namespace Microsoft.Windows.Controls.PropertyGrid }; propertyItem.SetBinding(PropertyItem.ValueProperty, binding); - ITypeEditor editor = GetTypeEditor(propertyItem); - propertyItem.Editor = editor.ResolveEditor(propertyItem); + propertyItem.Editor = GetTypeEditor(propertyItem); return propertyItem; } - private static PropertyCollection GetCategorizedProperties(List propertyItems) - { - PropertyCollection propertyCollection = new PropertyCollection(propertyItems); - propertyCollection.GroupBy("Category"); - propertyCollection.SortBy("Category", ListSortDirection.Ascending); - propertyCollection.SortBy("Name", ListSortDirection.Ascending); - return propertyCollection; - } - - private static PropertyCollection GetAlphabetizedProperties(List propertyItems) - { - PropertyCollection propertyCollection = new PropertyCollection(propertyItems); - propertyCollection.SortBy("Name", ListSortDirection.Ascending); - return propertyCollection; - } - - private void SetSelectedObjectNameBinding(object selectedObject) - { - if (selectedObject is FrameworkElement) - { - var binding = new Binding("Name"); - binding.Source = selectedObject; - binding.Mode = BindingMode.OneWay; - BindingOperations.SetBinding(this, PropertyGrid.SelectedObjectNameProperty, binding); - } - } - - private void SetDragThumbMargin(bool isCategorized) - { - if (_dragThumb == null) - return; - - if (isCategorized) - _dragThumb.Margin = new Thickness(6, 0, 0, 0); - else - _dragThumb.Margin = new Thickness(-1, 0, 0, 0); - } - - private void ResetPropertyGrid() - { - SelectedObjectName = String.Empty; - SelectedObjectType = null; - _propertyItemsCache = null; - Properties = null; - } - - /// - /// Updates all property values in the PropertyGrid with the data from the SelectedObject - /// - public void Update() + private FrameworkElement GetTypeEditor(PropertyItem propertyItem) { - foreach (var item in Properties) - { - BindingOperations.GetBindingExpressionBase(item, PropertyItem.ValueProperty).UpdateTarget(); - } - } - - #endregion //Methods - - - private ITypeEditor GetTypeEditor(PropertyItem propertyItem) - { - ITypeEditor editor = null; - - editor = CreateCustomEditor(propertyItem, CustomTypeEditors); + FrameworkElement editor = GetCustomEditor(propertyItem, EditorDefinitions); if (editor == null) editor = CreateDefaultEditor(propertyItem); @@ -484,15 +421,15 @@ namespace Microsoft.Windows.Controls.PropertyGrid return editor; } - private ITypeEditor CreateCustomEditor(PropertyItem propertyItem, CustomTypeEditorCollection customTypeEditors) + private FrameworkElement GetCustomEditor(PropertyItem propertyItem, EditorDefinitionCollection customTypeEditors) { - ITypeEditor editor = null; + FrameworkElement editor = null; //check for custom editor if (customTypeEditors.Count > 0) { //first check if the custom editor is type based - ICustomTypeEditor customEditor = customTypeEditors[propertyItem.PropertyType]; + IEditorDefinition customEditor = customTypeEditors[propertyItem.PropertyType]; if (customEditor == null) { //must be property based @@ -500,13 +437,16 @@ namespace Microsoft.Windows.Controls.PropertyGrid } if (customEditor != null) - editor = customEditor.Editor; + { + if (customEditor.EditorTemplate != null) + editor = customEditor.EditorTemplate.LoadContent() as FrameworkElement; + } } return editor; } - private ITypeEditor CreateDefaultEditor(PropertyItem propertyItem) + private FrameworkElement CreateDefaultEditor(PropertyItem propertyItem) { ITypeEditor editor = null; @@ -544,7 +484,66 @@ namespace Microsoft.Windows.Controls.PropertyGrid else editor = new TextBoxEditor(); - return editor; + return editor.ResolveEditor(propertyItem); + } + + private static PropertyItemCollection GetCategorizedProperties(List propertyItems) + { + PropertyItemCollection propertyCollection = new PropertyItemCollection(propertyItems); + propertyCollection.GroupBy("Category"); + propertyCollection.SortBy("Category", ListSortDirection.Ascending); + propertyCollection.SortBy("Name", ListSortDirection.Ascending); + return propertyCollection; + } + + private static PropertyItemCollection GetAlphabetizedProperties(List propertyItems) + { + PropertyItemCollection propertyCollection = new PropertyItemCollection(propertyItems); + propertyCollection.SortBy("Name", ListSortDirection.Ascending); + return propertyCollection; + } + + private void SetSelectedObjectNameBinding(object selectedObject) + { + if (selectedObject is FrameworkElement) + { + var binding = new Binding("Name"); + binding.Source = selectedObject; + binding.Mode = BindingMode.OneWay; + BindingOperations.SetBinding(this, PropertyGrid.SelectedObjectNameProperty, binding); + } } + + private void SetDragThumbMargin(bool isCategorized) + { + if (_dragThumb == null) + return; + + if (isCategorized) + _dragThumb.Margin = new Thickness(6, 0, 0, 0); + else + _dragThumb.Margin = new Thickness(-1, 0, 0, 0); + } + + private void ResetPropertyGrid() + { + SelectedObjectName = String.Empty; + SelectedObjectType = null; + _propertyItemsCache = null; + Properties = null; + } + + /// + /// Updates all property values in the PropertyGrid with the data from the SelectedObject + /// + public void Update() + { + foreach (var item in Properties) + { + BindingOperations.GetBindingExpressionBase(item, PropertyItem.ValueProperty).UpdateTarget(); + } + } + + #endregion //Methods } } diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyItem.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyItem.cs index 68be59fb..8278697f 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyItem.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyItem.cs @@ -41,19 +41,35 @@ namespace Microsoft.Windows.Controls.PropertyGrid { get { return (string)GetValue(DisplayNameProperty); } set { SetValue(DisplayNameProperty, value); } - } + } #endregion //DisplayName #region Editor - public static readonly DependencyProperty EditorProperty = DependencyProperty.Register("Editor", typeof(FrameworkElement), typeof(PropertyItem), new UIPropertyMetadata(null)); + public static readonly DependencyProperty EditorProperty = DependencyProperty.Register("Editor", typeof(FrameworkElement), typeof(PropertyItem), new UIPropertyMetadata(null, OnEditorChanged)); public FrameworkElement Editor { get { return (FrameworkElement)GetValue(EditorProperty); } set { SetValue(EditorProperty, value); } } + private static void OnEditorChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) + { + PropertyItem propertyItem = o as PropertyItem; + if (propertyItem != null) + propertyItem.OnEditorChanged((FrameworkElement)e.OldValue, (FrameworkElement)e.NewValue); + } + + protected virtual void OnEditorChanged(FrameworkElement oldValue, FrameworkElement newValue) + { + if (oldValue != null) + oldValue.DataContext = null; + + if (newValue != null) + newValue.DataContext = this; + } + #endregion //Editor private object _instance; diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyCollection.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyItemCollection.cs similarity index 78% rename from ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyCollection.cs rename to ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyItemCollection.cs index 7aac3fc8..d5762cea 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyCollection.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyItemCollection.cs @@ -6,19 +6,19 @@ using System.Windows.Data; namespace Microsoft.Windows.Controls.PropertyGrid { - public class PropertyCollection : ObservableCollection + public class PropertyItemCollection : ObservableCollection { - public PropertyCollection() + public PropertyItemCollection() { } - public PropertyCollection(List list) + public PropertyItemCollection(List list) : base(list) { } - public PropertyCollection(IEnumerable collection) + public PropertyItemCollection(IEnumerable collection) : base(collection) { diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj index a9c2c3cc..cdb27ccd 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj @@ -249,14 +249,14 @@ - - + + - + @@ -264,7 +264,7 @@ - +