From c1138ce2296ac488561f72aa5ccb854042d18f75 Mon Sep 17 00:00:00 2001 From: brianlagunas_cp Date: Sun, 13 Mar 2011 15:52:26 +0000 Subject: [PATCH] PropertyGrid: Re-architected editors. This alllows you to create and provide custom editors. --- .../CustomTypeEditorCollection.cs | 23 ++++ .../EditorProviders/CheckBoxEditorProvider.cs | 45 ------- .../EnumComboBoxEditorProvider.cs | 67 ----------- .../FontComboBoxEditorProvider.cs | 110 ------------------ .../EditorProviders/ITypeEditorProvider.cs | 11 -- .../NumericUpDownEditorProvider.cs | 41 ------- .../EditorProviders/TextBoxEditorProvider.cs | 42 ------- .../Implementation/Editors/CheckBoxEditor.cs | 16 +++ .../Implementation/Editors/ColorEditor.cs | 13 +++ .../Implementation/Editors/ComboBoxEditor.cs | 27 +++++ .../Editors/CustomTypeEditor.cs | 16 +++ .../Editors/EnumComboBoxEditor.cs | 41 +++++++ .../Editors/FontComboBoxEditor.cs | 104 +++++++++++++++++ .../Editors/ICustomTypeEditor.cs | 11 ++ .../Implementation/Editors/ITypeEditor.cs | 10 ++ .../Implementation/Editors/TextBoxEditor.cs | 14 +++ .../Implementation/Editors/TypeEditor.cs | 61 ++++++++++ .../Implementation/PropertyGrid.cs | 68 +++++++---- .../Implementation/PropertyItem.cs | 38 ++++++ .../WPFToolkit.Extended.csproj | 17 ++- 20 files changed, 433 insertions(+), 342 deletions(-) create mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/CustomTypeEditorCollection.cs delete mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorProviders/CheckBoxEditorProvider.cs delete mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorProviders/EnumComboBoxEditorProvider.cs delete mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorProviders/FontComboBoxEditorProvider.cs delete mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorProviders/ITypeEditorProvider.cs delete mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorProviders/NumericUpDownEditorProvider.cs delete mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorProviders/TextBoxEditorProvider.cs create mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/CheckBoxEditor.cs create mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ColorEditor.cs create mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ComboBoxEditor.cs create mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/CustomTypeEditor.cs create mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/EnumComboBoxEditor.cs create mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/FontComboBoxEditor.cs create mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ICustomTypeEditor.cs create mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ITypeEditor.cs create mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/TextBoxEditor.cs create mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/TypeEditor.cs diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/CustomTypeEditorCollection.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/CustomTypeEditorCollection.cs new file mode 100644 index 00000000..d8cfc800 --- /dev/null +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/CustomTypeEditorCollection.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.ObjectModel; +using Microsoft.Windows.Controls.PropertyGrid.Editors; + +namespace Microsoft.Windows.Controls.PropertyGrid +{ + public class CustomTypeEditorCollection : ObservableCollection + { + public ICustomTypeEditor this[string propertyName] + { + get + { + foreach (var item in Items) + { + if (item.Properties.Contains(propertyName)) + return item; + } + + return null; + } + } + } +} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorProviders/CheckBoxEditorProvider.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorProviders/CheckBoxEditorProvider.cs deleted file mode 100644 index 4d80b084..00000000 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorProviders/CheckBoxEditorProvider.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows; - -namespace Microsoft.Windows.Controls.PropertyGrid.Implementation.EditorProviders -{ - public class CheckBoxEditorProvider : ITypeEditorProvider - { - CheckBox _checkbox; - - public CheckBoxEditorProvider() - { - _checkbox = new CheckBox(); - _checkbox.Margin = new Thickness(2, 0, 0, 0); - } - - public void Initialize(PropertyItem propertyItem) - { - ResolveBinding(propertyItem); - } - - public FrameworkElement ResolveEditor() - { - return _checkbox; - } - - private void ResolveBinding(PropertyItem property) - { - var binding = new Binding(property.Name); - binding.Source = property.Instance; - binding.ValidatesOnExceptions = true; - binding.ValidatesOnDataErrors = true; - - if (property.IsWriteable) - binding.Mode = BindingMode.TwoWay; - else - binding.Mode = BindingMode.OneWay; - - BindingOperations.SetBinding(_checkbox, CheckBox.IsCheckedProperty, binding); - } - - - } -} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorProviders/EnumComboBoxEditorProvider.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorProviders/EnumComboBoxEditorProvider.cs deleted file mode 100644 index 17301263..00000000 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorProviders/EnumComboBoxEditorProvider.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Windows.Controls; -using System.Windows; -using System.Windows.Data; -using System.Reflection; - -namespace Microsoft.Windows.Controls.PropertyGrid.Implementation.EditorProviders -{ - public class EnumComboBoxEditorProvider : ITypeEditorProvider - { - ComboBox _comboBox; - - public EnumComboBoxEditorProvider() - { - _comboBox = new ComboBox(); - } - - public void Initialize(PropertyItem propertyItem) - { - ResolveBinding(propertyItem); - SetItemsSource(propertyItem); - } - - public FrameworkElement ResolveEditor() - { - return _comboBox; - } - - private void ResolveBinding(PropertyItem property) - { - var binding = new Binding(property.Name); - binding.Source = property.Instance; - binding.ValidatesOnExceptions = true; - binding.ValidatesOnDataErrors = true; - - if (property.IsWriteable) - binding.Mode = BindingMode.TwoWay; - else - binding.Mode = BindingMode.OneWay; - - BindingOperations.SetBinding(_comboBox, ComboBox.SelectedItemProperty, binding); - } - - private void SetItemsSource(PropertyItem property) - { - _comboBox.ItemsSource = GetValues(property.PropertyType); - } - - public static object[] GetValues(Type enumType) - { - List values = new List(); - - var fields = from field in enumType.GetFields() - where field.IsLiteral - select field; - - foreach (FieldInfo field in fields) - { - values.Add(field.GetValue(enumType)); - } - - return values.ToArray(); - } - } -} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorProviders/FontComboBoxEditorProvider.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorProviders/FontComboBoxEditorProvider.cs deleted file mode 100644 index a6c06394..00000000 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorProviders/FontComboBoxEditorProvider.cs +++ /dev/null @@ -1,110 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Windows.Controls; -using System.Windows; -using System.Windows.Data; -using System.Windows.Media; - -namespace Microsoft.Windows.Controls.PropertyGrid.Implementation.EditorProviders -{ - public class FontComboBoxEditorProvider : ITypeEditorProvider - { - ComboBox _comboBox; - - public FontComboBoxEditorProvider() - { - _comboBox = new ComboBox(); - } - - public void Initialize(PropertyItem propertyItem) - { - ResolveBinding(propertyItem); - SetItemsSource(propertyItem); - } - - public FrameworkElement ResolveEditor() - { - return _comboBox; - } - - private void ResolveBinding(PropertyItem property) - { - var binding = new Binding(property.Name); - binding.Source = property.Instance; - binding.ValidatesOnExceptions = true; - binding.ValidatesOnDataErrors = true; - - if (property.IsWriteable) - binding.Mode = BindingMode.TwoWay; - else - binding.Mode = BindingMode.OneWay; - - BindingOperations.SetBinding(_comboBox, ComboBox.SelectedItemProperty, binding); - } - - private void SetItemsSource(PropertyItem property) - { - if (property.PropertyType == typeof(FontFamily)) - { - List fonts = new List(); - fonts.Add(new FontFamily("Arial")); - fonts.Add(new FontFamily("Courier New")); - fonts.Add(new FontFamily("Times New Roman")); - fonts.Add(new FontFamily("Batang")); - fonts.Add(new FontFamily("BatangChe")); - fonts.Add(new FontFamily("DFKai-SB")); - fonts.Add(new FontFamily("Dotum")); - fonts.Add(new FontFamily("DutumChe")); - fonts.Add(new FontFamily("FangSong")); - fonts.Add(new FontFamily("GulimChe")); - fonts.Add(new FontFamily("Gungsuh")); - fonts.Add(new FontFamily("GungsuhChe")); - fonts.Add(new FontFamily("KaiTi")); - fonts.Add(new FontFamily("Malgun Gothic")); - fonts.Add(new FontFamily("Meiryo")); - fonts.Add(new FontFamily("Microsoft JhengHei")); - fonts.Add(new FontFamily("Microsoft YaHei")); - fonts.Add(new FontFamily("MingLiU")); - fonts.Add(new FontFamily("MingLiu_HKSCS")); - fonts.Add(new FontFamily("MingLiu_HKSCS-ExtB")); - fonts.Add(new FontFamily("MingLiu-ExtB")); - _comboBox.ItemsSource = fonts; - } - else if (property.PropertyType == typeof(FontWeight)) - { - List list = new List() - { - FontWeights.Black, FontWeights.Bold, FontWeights.ExtraBlack, FontWeights.ExtraBold, - FontWeights.ExtraLight, FontWeights.Light, FontWeights.Medium, FontWeights.Normal, FontWeights.SemiBold, - FontWeights.Thin - }; - _comboBox.ItemsSource = list; - } - else if (property.PropertyType == typeof(FontStyle)) - { - List list = new List() - { - FontStyles.Italic, - FontStyles.Normal - }; - _comboBox.ItemsSource = list; - } - else if (property.PropertyType == typeof(FontStretch)) - { - List list = new List() - { - FontStretches.Condensed, - FontStretches.Expanded, - FontStretches.ExtraCondensed, - FontStretches.ExtraExpanded, - FontStretches.Normal, - FontStretches.SemiCondensed, - FontStretches.SemiExpanded, - FontStretches.UltraCondensed, - FontStretches.UltraExpanded - }; - _comboBox.ItemsSource = list; - } - } - } -} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorProviders/ITypeEditorProvider.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorProviders/ITypeEditorProvider.cs deleted file mode 100644 index 5c629e96..00000000 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorProviders/ITypeEditorProvider.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Windows; - -namespace Microsoft.Windows.Controls.PropertyGrid.Implementation.EditorProviders -{ - interface ITypeEditorProvider - { - void Initialize(PropertyItem propertyItem); - FrameworkElement ResolveEditor(); - } -} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorProviders/NumericUpDownEditorProvider.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorProviders/NumericUpDownEditorProvider.cs deleted file mode 100644 index 8dd8a3d6..00000000 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorProviders/NumericUpDownEditorProvider.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Windows.Data; -using System.Windows; - -namespace Microsoft.Windows.Controls.PropertyGrid.Implementation.EditorProviders -{ - public class NumericUpDownEditorProvider : ITypeEditorProvider - { - NumericUpDown _numericUpDown; - - public NumericUpDownEditorProvider() - { - _numericUpDown = new NumericUpDown(); - } - - public void Initialize(PropertyItem propertyItem) - { - ResolveBinding(propertyItem); - } - - public FrameworkElement ResolveEditor() - { - return _numericUpDown; - } - - private void ResolveBinding(PropertyItem property) - { - var binding = new Binding(property.Name); - binding.Source = property.Instance; - binding.ValidatesOnExceptions = true; - binding.ValidatesOnDataErrors = true; - - if (property.IsWriteable) - binding.Mode = BindingMode.TwoWay; - else - binding.Mode = BindingMode.OneWay; - - BindingOperations.SetBinding(_numericUpDown, NumericUpDown.ValueProperty, binding); - } - } -} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorProviders/TextBoxEditorProvider.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorProviders/TextBoxEditorProvider.cs deleted file mode 100644 index c475713d..00000000 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/EditorProviders/TextBoxEditorProvider.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows; - -namespace Microsoft.Windows.Controls.PropertyGrid.Implementation.EditorProviders -{ - public class TextBoxEditorProvider : ITypeEditorProvider - { - FrameworkElement _editor; - - public TextBoxEditorProvider() - { - _editor = new TextBox(); - } - - public void Initialize(PropertyItem propertyItem) - { - ResolveBinding(propertyItem); - } - - public FrameworkElement ResolveEditor() - { - return _editor; - } - - private void ResolveBinding(PropertyItem property) - { - var binding = new Binding(property.Name); - binding.Source = property.Instance; - binding.ValidatesOnExceptions = true; - binding.ValidatesOnDataErrors = true; - - if (property.IsWriteable) - binding.Mode = BindingMode.TwoWay; - else - binding.Mode = BindingMode.OneWay; - - BindingOperations.SetBinding(_editor, TextBox.TextProperty, binding); - } - } -} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/CheckBoxEditor.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/CheckBoxEditor.cs new file mode 100644 index 00000000..64774017 --- /dev/null +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/CheckBoxEditor.cs @@ -0,0 +1,16 @@ +using System.Windows; +using System.Windows.Controls; + +namespace Microsoft.Windows.Controls.PropertyGrid.Editors +{ + public class CheckBoxEditor : TypeEditor + { + protected override void Initialize() + { + Editor = new CheckBox(); + Editor.Margin = new Thickness(4, 0, 0, 0); + + ValueProperty = CheckBox.IsCheckedProperty; + } + } +} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ColorEditor.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ColorEditor.cs new file mode 100644 index 00000000..2939b906 --- /dev/null +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ColorEditor.cs @@ -0,0 +1,13 @@ +using System; + +namespace Microsoft.Windows.Controls.PropertyGrid.Editors +{ + public class ColorEditor : TypeEditor + { + protected override void Initialize() + { + Editor = new ColorPicker(); + ValueProperty = ColorPicker.SelectedColorProperty; + } + } +} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ComboBoxEditor.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ComboBoxEditor.cs new file mode 100644 index 00000000..f1bacaf1 --- /dev/null +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ComboBoxEditor.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using System.Windows.Controls; + +namespace Microsoft.Windows.Controls.PropertyGrid.Editors +{ + public abstract class ComboBoxEditor : TypeEditor + { + protected override void Initialize() + { + Editor = new ComboBox(); + ValueProperty = ComboBox.SelectedItemProperty; + } + + public override void Attach(PropertyItem propertyItem) + { + SetItemsSource(propertyItem); + base.Attach(propertyItem); + } + + private void SetItemsSource(PropertyItem propertyItem) + { + (Editor as ComboBox).ItemsSource = CreateItemsSource(propertyItem); + } + + protected abstract IList CreateItemsSource(PropertyItem propertyItem); + } +} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/CustomTypeEditor.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/CustomTypeEditor.cs new file mode 100644 index 00000000..3e617091 --- /dev/null +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/CustomTypeEditor.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; + +namespace Microsoft.Windows.Controls.PropertyGrid.Editors +{ + public class CustomTypeEditor : ICustomTypeEditor + { + public ITypeEditor Editor { get; set; } + + private IList _properties = new List(); + public IList Properties + { + get { return _properties; } + set { _properties = value; } + } + } +} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/EnumComboBoxEditor.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/EnumComboBoxEditor.cs new file mode 100644 index 00000000..948bb2af --- /dev/null +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/EnumComboBoxEditor.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Windows.Controls; + +namespace Microsoft.Windows.Controls.PropertyGrid.Editors +{ + public class EnumComboBoxEditor : TypeEditor + { + protected override void Initialize() + { + Editor = new ComboBox(); + ValueProperty = ComboBox.SelectedItemProperty; + } + + public override void Attach(PropertyItem propertyItem) + { + SetItemsSource(propertyItem); + base.Attach(propertyItem); + } + + private void SetItemsSource(PropertyItem propertyItem) + { + (Editor as ComboBox).ItemsSource = GetValues(propertyItem.PropertyType); + } + + private static object[] GetValues(Type enumType) + { + List values = new List(); + + var fields = enumType.GetFields().Where(x => x.IsLiteral); + foreach (FieldInfo field in fields) + { + values.Add(field.GetValue(enumType)); + } + + return values.ToArray(); + } + } +} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/FontComboBoxEditor.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/FontComboBoxEditor.cs new file mode 100644 index 00000000..90c4943a --- /dev/null +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/FontComboBoxEditor.cs @@ -0,0 +1,104 @@ +using System.Collections.Generic; +using System.Windows; +using System.Windows.Media; + +namespace Microsoft.Windows.Controls.PropertyGrid.Editors +{ + public class FontComboBoxEditor : ComboBoxEditor + { + protected override IList CreateItemsSource(PropertyItem propertyItem) + { + if (propertyItem.PropertyType == typeof(FontFamily)) + { + return GetFontFamilies(); + } + else if (propertyItem.PropertyType == typeof(FontWeight)) + { + return GetFontWeights(); + } + else if (propertyItem.PropertyType == typeof(FontStyle)) + { + return GetFontStyles(); + } + else if (propertyItem.PropertyType == typeof(FontStretch)) + { + return GetFontStretches(); + } + + return null; + } + + private static IList GetFontFamilies() + { + IList fontFamilies = new List(); + + //TODO: get all fonts + fontFamilies.Add(new FontFamily("Arial")); + fontFamilies.Add(new FontFamily("Courier New")); + fontFamilies.Add(new FontFamily("Times New Roman")); + fontFamilies.Add(new FontFamily("Batang")); + fontFamilies.Add(new FontFamily("BatangChe")); + fontFamilies.Add(new FontFamily("DFKai-SB")); + fontFamilies.Add(new FontFamily("Dotum")); + fontFamilies.Add(new FontFamily("DutumChe")); + fontFamilies.Add(new FontFamily("FangSong")); + fontFamilies.Add(new FontFamily("GulimChe")); + fontFamilies.Add(new FontFamily("Gungsuh")); + fontFamilies.Add(new FontFamily("GungsuhChe")); + fontFamilies.Add(new FontFamily("KaiTi")); + fontFamilies.Add(new FontFamily("Malgun Gothic")); + fontFamilies.Add(new FontFamily("Meiryo")); + fontFamilies.Add(new FontFamily("Microsoft JhengHei")); + fontFamilies.Add(new FontFamily("Microsoft YaHei")); + fontFamilies.Add(new FontFamily("MingLiU")); + fontFamilies.Add(new FontFamily("MingLiu_HKSCS")); + fontFamilies.Add(new FontFamily("MingLiu_HKSCS-ExtB")); + fontFamilies.Add(new FontFamily("MingLiu-ExtB")); + fontFamilies.Add(new FontFamily("Segoe UI")); + + return fontFamilies; + } + + private static IList GetFontWeights() + { + return new List() + { + FontWeights.Black, + FontWeights.Bold, + FontWeights.ExtraBlack, + FontWeights.ExtraBold, + FontWeights.ExtraLight, + FontWeights.Light, + FontWeights.Medium, + FontWeights.Normal, + FontWeights.SemiBold, + FontWeights.Thin + }; + } + + private static IList GetFontStyles() + { + return new List() + { + FontStyles.Italic, + FontStyles.Normal + }; + } + + private static IList GetFontStretches() + { + return new List() + { + FontStretches.Condensed, + FontStretches.Expanded, + FontStretches.ExtraCondensed, + FontStretches.ExtraExpanded, + FontStretches.Normal, + FontStretches.SemiCondensed, + FontStretches.SemiExpanded, + FontStretches.UltraCondensed, + FontStretches.UltraExpanded + }; + } + } +} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ICustomTypeEditor.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ICustomTypeEditor.cs new file mode 100644 index 00000000..ee0019fd --- /dev/null +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ICustomTypeEditor.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; + +namespace Microsoft.Windows.Controls.PropertyGrid.Editors +{ + public interface ICustomTypeEditor + { + ITypeEditor Editor { get; set; } + IList Properties { get; set; } + } +} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ITypeEditor.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ITypeEditor.cs new file mode 100644 index 00000000..43cf6259 --- /dev/null +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/ITypeEditor.cs @@ -0,0 +1,10 @@ +using System.Windows; + +namespace Microsoft.Windows.Controls.PropertyGrid.Editors +{ + public interface ITypeEditor + { + void Attach(PropertyItem propertyItem); + FrameworkElement ResolveEditor(); + } +} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/TextBoxEditor.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/TextBoxEditor.cs new file mode 100644 index 00000000..4ec0ae30 --- /dev/null +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/TextBoxEditor.cs @@ -0,0 +1,14 @@ +using System; +using System.Windows.Controls; + +namespace Microsoft.Windows.Controls.PropertyGrid.Editors +{ + public class TextBoxEditor : TypeEditor + { + protected override void Initialize() + { + Editor = new TextBox(); + ValueProperty = TextBox.TextProperty; + } + } +} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/TypeEditor.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/TypeEditor.cs new file mode 100644 index 00000000..134e5238 --- /dev/null +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/Editors/TypeEditor.cs @@ -0,0 +1,61 @@ +using System; +using System.Windows; +using System.Windows.Data; + +namespace Microsoft.Windows.Controls.PropertyGrid.Editors +{ + public abstract class TypeEditor : ITypeEditor + { + #region Properties + + protected FrameworkElement Editor { get; set; } + protected DependencyProperty ValueProperty { get; set; } + + #endregion //Properties + + #region Constructors + + public TypeEditor() + { + Initialize(); + } + + #endregion //Constructors + + #region ITypeEditor Members + + public virtual void Attach(PropertyItem propertyItem) + { + ResolveBinding(propertyItem); + } + + public virtual FrameworkElement ResolveEditor() + { + return Editor; + } + + #endregion //ITypeEditor Members + + #region Methods + + protected abstract void Initialize(); + + protected virtual void ResolveBinding(PropertyItem propertyItem) + { + var _binding = new Binding("Value"); + _binding.Source = propertyItem; + _binding.ValidatesOnExceptions = true; + _binding.ValidatesOnDataErrors = true; + _binding.Mode = propertyItem.IsWriteable ? BindingMode.TwoWay : BindingMode.OneWay; + _binding.Converter = CreateConverter(); + BindingOperations.SetBinding(Editor, ValueProperty, _binding); + } + + protected virtual IValueConverter CreateConverter() + { + return null; + } + + #endregion //Methods + } +} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyGrid.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyGrid.cs index 5d52e69c..1fb2e6d7 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyGrid.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyGrid.cs @@ -7,8 +7,8 @@ using System.Windows.Data; using System.Windows.Media; using System.Windows.Controls.Primitives; using System.ComponentModel; -using Microsoft.Windows.Controls.PropertyGrid.Implementation.EditorProviders; using System.Windows.Input; +using Microsoft.Windows.Controls.PropertyGrid.Editors; namespace Microsoft.Windows.Controls.PropertyGrid { @@ -23,6 +23,17 @@ namespace Microsoft.Windows.Controls.PropertyGrid #region Properties + #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 IsCategorized public static readonly DependencyProperty IsCategorizedProperty = DependencyProperty.Register("IsCategorized", typeof(bool), typeof(PropertyGrid), new UIPropertyMetadata(true, OnIsCategorizedChanged)); @@ -237,30 +248,47 @@ namespace Microsoft.Windows.Controls.PropertyGrid return propertyItems; } - private static PropertyItem CreatePropertyItem(PropertyDescriptor property, object instance, PropertyGrid grid) + private PropertyItem CreatePropertyItem(PropertyDescriptor property, object instance, PropertyGrid grid) { PropertyItem propertyItem = new PropertyItem(instance, property, grid); - ITypeEditorProvider editorProvider = null; - - if (propertyItem.PropertyType == typeof(string)) - editorProvider = new TextBoxEditorProvider(); - else if (propertyItem.PropertyType == typeof(bool)) - editorProvider = new CheckBoxEditorProvider(); - else if (propertyItem.PropertyType.IsEnum) - editorProvider = new EnumComboBoxEditorProvider(); - else if (propertyItem.PropertyType == typeof(FontFamily) || propertyItem.PropertyType == typeof(FontWeight) || propertyItem.PropertyType == typeof(FontStyle) || propertyItem.PropertyType == typeof(FontStretch)) - editorProvider = new FontComboBoxEditorProvider(); - else if (propertyItem.PropertyType == typeof(double)) - editorProvider = new TextBoxEditorProvider(); - else if (propertyItem.PropertyType == typeof(object) || propertyItem.PropertyType == typeof(Thickness)) - editorProvider = new TextBoxEditorProvider(); - - if (editorProvider != null) + + var binding = new Binding(property.Name) { - editorProvider.Initialize(propertyItem); - propertyItem.Editor = editorProvider.ResolveEditor(); + Source = instance, + ValidatesOnExceptions = true, + ValidatesOnDataErrors = true, + Mode = propertyItem.IsWriteable ? BindingMode.TwoWay : BindingMode.OneWay + }; + propertyItem.SetBinding(PropertyItem.ValueProperty, binding); + + ITypeEditor editor = null; + + //check for custom editor + if (CustomTypeEditors.Count > 0) + { + ICustomTypeEditor customEditor = CustomTypeEditors[propertyItem.Name]; + if (customEditor != null) + { + editor = customEditor.Editor; + } } + //no custom editor found + if (editor == null) + { + if (propertyItem.PropertyType == typeof(bool)) + editor = new CheckBoxEditor(); + 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 + editor = new TextBoxEditor(); + } + + editor.Attach(propertyItem); + propertyItem.Editor = editor.ResolveEditor(); + return propertyItem; } diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyItem.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyItem.cs index dbd4461b..b0e1ef5a 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyItem.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/PropertyGrid/Implementation/PropertyItem.cs @@ -69,6 +69,44 @@ namespace Microsoft.Windows.Controls.PropertyGrid #endregion //Editor + #region Value + + public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(object), typeof(PropertyItem), new UIPropertyMetadata(null, new PropertyChangedCallback(OnValueChanged), new CoerceValueCallback(OnCoerceValue))); + public object Value + { + get { return (object)GetValue(ValueProperty); } + set { SetValue(ValueProperty, value); } + } + + private static object OnCoerceValue(DependencyObject o, object value) + { + PropertyItem propertyItem = o as PropertyItem; + if (propertyItem != null) + return propertyItem.OnCoerceValue((object)value); + else + return value; + } + + private static void OnValueChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) + { + PropertyItem propertyItem = o as PropertyItem; + if (propertyItem != null) + propertyItem.OnValueChanged((object)e.OldValue, (object)e.NewValue); + } + + protected virtual object OnCoerceValue(object value) + { + // TODO: Keep the proposed value within the desired range. + return value; + } + + protected virtual void OnValueChanged(object oldValue, object newValue) + { + // TODO: Add your property changed side-effects. Descendants can override as well. + } + + #endregion //Value + #endregion //Properties #region Constructor diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj index f0a7f868..8017a935 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj @@ -164,12 +164,17 @@ True - - - - - - + + + + + + + + + + +