From 50f76f064943e90de976dbb0170445dfcfa7c605 Mon Sep 17 00:00:00 2001 From: brianlagunas_cp Date: Fri, 7 Oct 2011 00:53:21 +0000 Subject: [PATCH] PropertyGrid: added new property called AutoGenerateProperties. When true it will autogenerate all properties for an object. Wehn set to false if till not generate any properties, but instead you supply the property to show be defining PropertyDefinitions. here is an example: This will only show the FirstName and Age properties of the bound object. --- .../Implementation/EditorDefinition.cs | 7 +-- .../EditorDefinitionCollection.cs | 3 +- .../Implementation/IEditorDefinition.cs | 3 +- .../Implementation/PropertyDefinition.cs | 9 +++ .../PropertyDefinitionCollection.cs | 21 +++++++ .../Implementation/PropertyGrid.cs | 55 +++++++++++++++++-- .../WPFToolkit.Extended.csproj | 2 + 7 files changed, 89 insertions(+), 11 deletions(-) create mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyDefinition.cs create mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyDefinitionCollection.cs diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorDefinition.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorDefinition.cs index a1792702..59f03084 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorDefinition.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorDefinition.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using System; +using System; using System.Windows; namespace Microsoft.Windows.Controls.PropertyGrid @@ -8,8 +7,8 @@ namespace Microsoft.Windows.Controls.PropertyGrid { public DataTemplate EditorTemplate { get; set; } - private List _properties = new List(); - public List Properties + private PropertyDefinitionCollection _properties = new PropertyDefinitionCollection(); + public PropertyDefinitionCollection PropertiesDefinitions { get { return _properties; } set { _properties = value; } diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorDefinitionCollection.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorDefinitionCollection.cs index 456c39b7..a67adc7d 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorDefinitionCollection.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorDefinitionCollection.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.Collections.ObjectModel; namespace Microsoft.Windows.Controls.PropertyGrid @@ -11,7 +12,7 @@ namespace Microsoft.Windows.Controls.PropertyGrid { foreach (var item in Items) { - if (item.Properties.Contains(propertyName)) + if (item.PropertiesDefinitions.Where(x => x.Name == propertyName).Any()) return item; } diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/IEditorDefinition.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/IEditorDefinition.cs index bb43ecc8..5d8c0039 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/IEditorDefinition.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/IEditorDefinition.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Windows; namespace Microsoft.Windows.Controls.PropertyGrid @@ -7,7 +6,7 @@ namespace Microsoft.Windows.Controls.PropertyGrid public interface IEditorDefinition { DataTemplate EditorTemplate { get; set; } - List Properties { get; set; } + PropertyDefinitionCollection PropertiesDefinitions { get; set; } Type TargetType { get; set; } } } diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyDefinition.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyDefinition.cs new file mode 100644 index 00000000..2c66aac6 --- /dev/null +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyDefinition.cs @@ -0,0 +1,9 @@ +using System; + +namespace Microsoft.Windows.Controls.PropertyGrid +{ + public class PropertyDefinition + { + public string Name { get; set; } + } +} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyDefinitionCollection.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyDefinitionCollection.cs new file mode 100644 index 00000000..0c8ca829 --- /dev/null +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyDefinitionCollection.cs @@ -0,0 +1,21 @@ +using System.Collections.ObjectModel; + +namespace Microsoft.Windows.Controls.PropertyGrid +{ + public class PropertyDefinitionCollection : ObservableCollection + { + public PropertyDefinition this[string propertyName] + { + get + { + foreach (var item in Items) + { + if (item.Name == propertyName) + return item; + } + + return null; + } + } + } +} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyGrid.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyGrid.cs index 0c9c38df..7502d665 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyGrid.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyGrid.cs @@ -8,6 +8,7 @@ using System.Windows.Controls.Primitives; using System.Windows.Data; using System.Windows.Input; using Microsoft.Windows.Controls.PropertyGrid.Commands; +using System.Reflection; namespace Microsoft.Windows.Controls.PropertyGrid { @@ -33,6 +34,17 @@ namespace Microsoft.Windows.Controls.PropertyGrid #endregion //AdvancedOptionsMenu + #region AutoGenerateProperties + + public static readonly DependencyProperty AutoGeneratePropertiesProperty = DependencyProperty.Register("AutoGenerateProperties", typeof(bool), typeof(PropertyGrid), new UIPropertyMetadata(true)); + public bool AutoGenerateProperties + { + get { return (bool)GetValue(AutoGeneratePropertiesProperty); } + set { SetValue(AutoGeneratePropertiesProperty, value); } + } + + #endregion //AutoGenerateProperties + #region DisplaySummary public static readonly DependencyProperty DisplaySummaryProperty = DependencyProperty.Register("DisplaySummary", typeof(bool), typeof(PropertyGrid), new UIPropertyMetadata(true)); @@ -46,7 +58,7 @@ namespace Microsoft.Windows.Controls.PropertyGrid #region EditorDefinitions - public static readonly DependencyProperty EditorDefinitionsProperty = DependencyProperty.Register("EditorDefinitions", typeof(EditorDefinitionCollection), typeof(PropertyGrid), new UIPropertyMetadata(new EditorDefinitionCollection())); + public static readonly DependencyProperty EditorDefinitionsProperty = DependencyProperty.Register("EditorDefinitions", typeof(EditorDefinitionCollection), typeof(PropertyGrid), new UIPropertyMetadata(null)); public EditorDefinitionCollection EditorDefinitions { get { return (EditorDefinitionCollection)GetValue(EditorDefinitionsProperty); } @@ -124,6 +136,17 @@ namespace Microsoft.Windows.Controls.PropertyGrid #endregion //Properties + #region PropertyDefinitions + + public static readonly DependencyProperty PropertyDefinitionsProperty = DependencyProperty.Register("PropertyDefinitions", typeof(PropertyDefinitionCollection), typeof(PropertyGrid), new UIPropertyMetadata(null)); + public PropertyDefinitionCollection PropertyDefinitions + { + get { return (PropertyDefinitionCollection)GetValue(PropertyDefinitionsProperty); } + set { SetValue(PropertyDefinitionsProperty, value); } + } + + #endregion //PropertyDefinitions + #region SelectedObject public static readonly DependencyProperty SelectedObjectProperty = DependencyProperty.Register("SelectedObject", typeof(object), typeof(PropertyGrid), new UIPropertyMetadata(null, OnSelectedObjectChanged)); @@ -275,6 +298,8 @@ namespace Microsoft.Windows.Controls.PropertyGrid public PropertyGrid() { + EditorDefinitions = new EditorDefinitionCollection(); + PropertyDefinitions = new PropertyDefinitionCollection(); CommandBindings.Add(new CommandBinding(PropertyGridCommands.ClearFilter, ClearFilter, CanClearFilter)); } @@ -286,8 +311,11 @@ namespace Microsoft.Windows.Controls.PropertyGrid { base.OnApplyTemplate(); - _dragThumb = (Thumb)GetTemplateChild("PART_DragThumb"); - _dragThumb.DragDelta += DragThumb_DragDelta; + if (_dragThumb != null) + _dragThumb.DragDelta -= DragThumb_DragDelta; + _dragThumb = GetTemplateChild("PART_DragThumb") as Thumb; + if (_dragThumb != null) + _dragThumb.DragDelta += DragThumb_DragDelta; } protected override void OnPreviewKeyDown(KeyEventArgs e) @@ -355,7 +383,26 @@ namespace Microsoft.Windows.Controls.PropertyGrid try { - var descriptors = PropertyGridUtilities.GetPropertyDescriptors(instance); + PropertyDescriptorCollection descriptors = PropertyGridUtilities.GetPropertyDescriptors(instance); + + if (!AutoGenerateProperties) + { + List specificProperties = new List(); + foreach (PropertyDefinition pd in PropertyDefinitions) + { + foreach (PropertyDescriptor descriptor in descriptors) + { + if (descriptor.Name == pd.Name) + { + specificProperties.Add(descriptor); + break; + } + } + } + + descriptors = new PropertyDescriptorCollection(specificProperties.ToArray()); + } + foreach (PropertyDescriptor descriptor in descriptors) { if (descriptor.IsBrowsable) diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj index e104e7c5..d7f60f2d 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj @@ -268,6 +268,8 @@ + +