{"id":3157,"date":"2025-09-17T16:40:45","date_gmt":"2025-09-17T16:40:45","guid":{"rendered":"https:\/\/xceed.com\/?p=3157"},"modified":"2025-09-18T13:15:15","modified_gmt":"2025-09-18T13:15:15","slug":"build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid","status":"publish","type":"post","link":"https:\/\/xceed.com\/es\/blog\/all\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\/","title":{"rendered":"Build a Configurable Admin Panel in WPF Using Toolkit Plus PropertyGrid"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"3157\" class=\"elementor elementor-3157\" data-elementor-post-type=\"post\">\n\t\t\t\t<div class=\"elementor-element elementor-element-73891fe2 e-flex e-con-boxed e-con e-parent\" data-id=\"73891fe2\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-25752e6c elementor-widget elementor-widget-text-editor\" data-id=\"25752e6c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h1 class=\"wp-block-heading\"><mark class=\"has-inline-color has-primary-color\" style=\"background-color: rgba(0, 0, 0, 0);\">Build a Config Panel Fast<\/mark><\/h1>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2 class=\"wp-block-heading\"><strong>Getting started: install and bind a Settings object<\/strong><\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:heading {\"level\":3} --><\/p>\n<h3 class=\"wp-block-heading\"><strong>Install and namespaces<\/strong><\/h3>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:list --><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\"><!-- wp:list-item --><\/ul>\n<\/li>\n<\/ul>\n<p>\u00a0<\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>Add the Toolkit Plus package to your WPF project.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><!-- \/wp:list-item --><\/p>\n<p><!-- wp:list-item --><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>In XAML, import the namespace:<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><!-- \/wp:list-item --><\/p>\n<p><!-- \/wp:list --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>xmlns:xcad=\"&lt;http:\/\/schemas.xceed.com\/wpf\/xaml\/toolkit&gt;\"\n<\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:heading {\"level\":3} --><\/p>\n<h3 class=\"wp-block-heading\"><strong>Basic binding to Settings in MVVM<\/strong><\/h3>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Create a Settings POCO and expose it on a SettingsViewModel. Bind PropertyGrid.SelectedObject to your Settings instance\u2014no templates required.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p><strong>Code: Settings model (baseline)<\/strong><\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>public class AppSettings\n{\n  public string Environment { get; set; } = \"Production\";\n  public int RetryCount { get; set; } = 3;\n  public bool EnableAuditTrail { get; set; } = true;\n  public TimeSpan Timeout { get; set; } = TimeSpan.FromSeconds(30);\n  public string ThemeColor { get; set; } = \"#FFAA5500\"; \/\/ brand accent\n  public string ReportsFolder { get; set; } = \"C:\\\\\\\\Reports\";\n}\n<\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p><strong>Code: ViewModel<\/strong><\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>public class SettingsViewModel : INotifyPropertyChanged\n{\n  public AppSettings Settings { get; } = new();\n  public ICommand SaveCommand { get; }\n  public ICommand LoadCommand { get; }\n\n  public SettingsViewModel()\n  {\n    SaveCommand = new RelayCommand(_ =&gt; Save());\n    LoadCommand = new RelayCommand(_ =&gt; Load());\n  }\n\n  \/\/ Implement INotifyPropertyChanged, Save, Load below\n}\n<\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p><strong>Code: XAML (PropertyGrid)<\/strong><\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>&lt;Grid&gt;\n  &lt;Grid.RowDefinitions&gt;\n    &lt;RowDefinition Height=\"*\"\/&gt;\n    &lt;RowDefinition Height=\"Auto\"\/&gt;\n  &lt;\/Grid.RowDefinitions&gt;\n\n  &lt;xcad:PropertyGrid\n    SelectedObject=\"{Binding Settings}\"\n    AutoGenerateProperties=\"True\"\n    NameColumnWidth=\"240\"\n    HelpVisible=\"True\"\n    DescriptionVisibility=\"Visible\"\n    IsCategorized=\"True\" \/&gt;\n\n  &lt;StackPanel Grid.Row=\"1\" Orientation=\"Horizontal\" HorizontalAlignment=\"Right\" Margin=\"0,12,0,0\"&gt;\n    &lt;Button Content=\"Load\" Command=\"{Binding LoadCommand}\" Margin=\"0,0,8,0\"\/&gt;\n    &lt;Button Content=\"Save\" Command=\"{Binding SaveCommand}\" \/&gt;\n  &lt;\/StackPanel&gt;\n&lt;\/Grid&gt;\n<\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:separator --><\/p>\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n<p><!-- \/wp:separator --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2 class=\"wp-block-heading\"><strong>Custom editors and attributes that feel \u201ceditor-quality\u201d<\/strong><\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Use .NET attributes to group, label, and describe settings. When you need richer input (dropdowns, numeric spinners, color pickers, file pickers), swap editors cleanly via EditorAttribute or editor mappings.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:heading {\"level\":3} --><\/p>\n<h3 class=\"wp-block-heading\"><strong>Categorize and describe with attributes<\/strong><\/h3>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p><strong>Code: Settings model with attributes<\/strong><\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>using System.ComponentModel;\n\npublic class AppSettings\n{\n  [Category(\"General\")]\n  [DisplayName(\"Environment\")]\n  [Description(\"Target environment for API calls.\")]\n  public string Environment { get; set; } = \"Production\";\n\n  [Category(\"General\")]\n  [DisplayName(\"Retry Count\")]\n  [Description(\"Number of retry attempts for transient failures.\")]\n  public int RetryCount { get; set; } = 3;\n\n  [Category(\"Security\")]\n  [DisplayName(\"Enable Audit Trail\")]\n  [Description(\"Record configuration changes for compliance.\")]\n  public bool EnableAuditTrail { get; set; } = true;\n\n  [Category(\"Performance\")]\n  [DisplayName(\"Timeout\")]\n  [Description(\"Request timeout duration.\")]\n  public TimeSpan Timeout { get; set; } = TimeSpan.FromSeconds(30);\n\n  [Category(\"Branding\")]\n  [DisplayName(\"Theme Color\")]\n  [Description(\"Accent color for the application theme.\")]\n  public string ThemeColor { get; set; } = \"#FFAA5500\";\n\n  [Category(\"Reports\")]\n  [DisplayName(\"Reports Folder\")]\n  [Description(\"Directory where generated reports are stored.\")]\n  public string ReportsFolder { get; set; } = \"C:\\\\\\\\Reports\";\n}\n<\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:heading {\"level\":3} --><\/p>\n<h3 class=\"wp-block-heading\"><strong>Swap in dropdowns, numeric spinners, color pickers, and file pickers<\/strong><\/h3>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p><strong>Approach A: Type-based editor mapping in XAML (keeps models clean).<\/strong><\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p><strong>Code: Editor mapping in XAML<\/strong><\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>&lt;xcad:PropertyGrid SelectedObject=\"{Binding Settings}\" AutoGenerateProperties=\"True\" IsCategorized=\"True\"&gt;\n  &lt;xcad:PropertyGrid.EditorDefinitions&gt;\n\n    &lt;!-- Environment: ComboBox with fixed options --&gt;\n    &lt;xcad:EditorTemplateDefinition&gt;\n      &lt;xcad:EditorTemplateDefinition.TargetProperties&gt;\n        &lt;xcad:TargetPropertyDefinition PropertyName=\"Environment\"\/&gt;\n      &lt;\/xcad:EditorTemplateDefinition.TargetProperties&gt;\n      &lt;xcad:EditorTemplateDefinition.EditingTemplate&gt;\n        &lt;DataTemplate&gt;\n          &lt;ComboBox SelectedItem=\"{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}\"\n                    ItemsSource=\"{Binding DataContext.Environments, RelativeSource={RelativeSource AncestorType=xcad:PropertyGrid}}\" \/&gt;\n        &lt;\/DataTemplate&gt;\n      &lt;\/xcad:EditorTemplateDefinition.EditingTemplate&gt;\n    &lt;\/xcad:EditorTemplateDefinition&gt;\n\n    &lt;!-- RetryCount: NumericUpDown --&gt;\n    &lt;xcad:EditorTemplateDefinition&gt;\n      &lt;xcad:EditorTemplateDefinition.TargetProperties&gt;\n        &lt;xcad:TargetPropertyDefinition PropertyName=\"RetryCount\"\/&gt;\n      &lt;\/xcad:EditorTemplateDefinition.TargetProperties&gt;\n      &lt;xcad:EditorTemplateDefinition.EditingTemplate&gt;\n        &lt;DataTemplate&gt;\n          &lt;xcad:IntegerUpDown Minimum=\"0\" Maximum=\"10\"\n             Value=\"{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}\" \/&gt;\n        &lt;\/DataTemplate&gt;\n      &lt;\/xcad:EditorTemplateDefinition.EditingTemplate&gt;\n    &lt;\/xcad:EditorTemplateDefinition&gt;\n\n    &lt;!-- ThemeColor: ColorPicker --&gt;\n    &lt;xcad:EditorTemplateDefinition&gt;\n      &lt;xcad:EditorTemplateDefinition.TargetProperties&gt;\n        &lt;xcad:TargetPropertyDefinition PropertyName=\"ThemeColor\"\/&gt;\n      &lt;\/xcad:EditorTemplateDefinition.TargetProperties&gt;\n      &lt;xcad:EditorTemplateDefinition.EditingTemplate&gt;\n        &lt;DataTemplate&gt;\n          &lt;xcad:ColorPicker\n            SelectedColor=\"{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}\" \/&gt;\n        &lt;\/DataTemplate&gt;\n      &lt;\/xcad:EditorTemplateDefinition.EditingTemplate&gt;\n    &lt;\/xcad:EditorTemplateDefinition&gt;\n\n    &lt;!-- ReportsFolder: file picker --&gt;\n    &lt;xcad:EditorTemplateDefinition&gt;\n      &lt;xcad:EditorTemplateDefinition.TargetProperties&gt;\n        &lt;xcad:TargetPropertyDefinition PropertyName=\"ReportsFolder\"\/&gt;\n      &lt;\/xcad:EditorTemplateDefinition.TargetProperties&gt;\n      &lt;xcad:EditorTemplateDefinition.EditingTemplate&gt;\n        &lt;DataTemplate&gt;\n          &lt;DockPanel&gt;\n            &lt;TextBox Text=\"{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}\" MinWidth=\"260\" \/&gt;\n            &lt;Button Content=\"Browse...\" Margin=\"8,0,0,0\" Command=\"{Binding DataContext.BrowseFolderCommand, RelativeSource={RelativeSource AncestorType=xcad:PropertyGrid}}\" \/&gt;\n          &lt;\/DockPanel&gt;\n        &lt;\/DataTemplate&gt;\n      &lt;\/xcad:EditorTemplateDefinition.EditingTemplate&gt;\n    &lt;\/xcad:EditorTemplateDefinition&gt;\n\n  &lt;\/xcad:PropertyGrid.EditorDefinitions&gt;\n&lt;\/xcad:PropertyGrid&gt;\n<\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p><strong>Code: ViewModel extras for editors<\/strong><\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>public ObservableCollection&lt;string&gt; Environments { get; } =\n  new(new[] { \"Development\", \"Staging\", \"Production\" });\n\npublic ICommand BrowseFolderCommand =&gt; new RelayCommand(_ =&gt;\n{\n  var dlg = new Microsoft.Win32.OpenFileDialog\n  {\n    CheckFileExists = false,\n    ValidateNames = false,\n    FileName = \"Select Folder\"\n  };\n  if (dlg.ShowDialog() == true)\n  {\n    \/\/ Get folder from selected path\n    var folder = System.IO.Path.GetDirectoryName(dlg.FileName);\n    if (!string.IsNullOrEmpty(folder))\n      Settings.ReportsFolder = folder;\n  }\n});\n<\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p><strong>Approach B: Attribute-driven editors (when you prefer annotating the model)<\/strong><\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Use EditorAttribute to associate specific editors with properties. If you maintain a shared \u201cSettings\u201d assembly, keep it UI-agnostic and prefer XAML mapping (Approach A).<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:separator --><\/p>\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n<p><!-- \/wp:separator --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2 class=\"wp-block-heading\"><strong>Validation and persistence that don\u2019t fight MVVM<\/strong><\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:heading {\"level\":3} --><\/p>\n<h3 class=\"wp-block-heading\"><strong>Live validation with INotifyDataErrorInfo<\/strong><\/h3>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Implement INotifyDataErrorInfo on the ViewModel to surface inline validation (for example minimum timeouts, folder existence). PropertyGrid will display errors without modal dialogs.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p><strong>Code: INotifyDataErrorInfo pattern<\/strong><\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>public partial class SettingsViewModel : INotifyPropertyChanged, INotifyDataErrorInfo\n{\n  private readonly Dictionary&lt;string, List&lt;string&gt;&gt; _errors = new();\n\n  public bool HasErrors =&gt; _errors.Count &gt; 0;\n  public event EventHandler&lt;DataErrorsChangedEventArgs&gt; ErrorsChanged;\n\n  public IEnumerable GetErrors(string propertyName)\n    =&gt; propertyName != null &amp;&amp; _errors.TryGetValue(propertyName, out var list) ? list : null;\n\n  private void Validate()\n  {\n    ClearErrors(nameof(Settings.Timeout));\n    if (Settings.Timeout &lt; TimeSpan.FromSeconds(5))\n      AddError(nameof(Settings.Timeout), \"Timeout must be at least 5 seconds.\");\n\n    ClearErrors(nameof(Settings.ReportsFolder));\n    if (string.IsNullOrWhiteSpace(Settings.ReportsFolder) || !Directory.Exists(Settings.ReportsFolder))\n      AddError(nameof(Settings.ReportsFolder), \"Folder must exist.\");\n\n    ClearErrors(nameof(Settings.RetryCount));\n    if (Settings.RetryCount is &lt; 0 or &gt; 10)\n      AddError(nameof(Settings.RetryCount), \"RetryCount must be between 0 and 10.\");\n  }\n\n  private void AddError(string prop, string error)\n  {\n    if (!_errors.TryGetValue(prop, out var list)) _errors[prop] = list = new List&lt;string&gt;();\n    if (!list.Contains(error)) list.Add(error);\n    ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(prop));\n  }\n\n  private void ClearErrors(string prop)\n  {\n    if (_errors.Remove(prop)) ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(prop));\n  }\n}\n<\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Wire validation to property changes (for example via setter notifications or a timer\/debounce if needed).<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:heading {\"level\":3} --><\/p>\n<h3 class=\"wp-block-heading\"><strong>Persist settings with System.Text.Json<\/strong><\/h3>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p><strong>Code: Save\/Load helpers<\/strong><\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>using System.Text.Json;\n\nprivate static readonly JsonSerializerOptions JsonOpts = new()\n{\n  WriteIndented = true\n};\n\nprivate string SettingsFilePath =&gt;\n  Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), \"MyApp\", \"settings.json\");\n\nprivate void Save()\n{\n  Directory.CreateDirectory(Path.GetDirectoryName(SettingsFilePath)!);\n  var json = JsonSerializer.Serialize(Settings, JsonOpts);\n  File.WriteAllText(SettingsFilePath, json);\n}\n\nprivate void Load()\n{\n  if (!File.Exists(SettingsFilePath)) return;\n  var json = File.ReadAllText(SettingsFilePath);\n  var loaded = JsonSerializer.Deserialize&lt;AppSettings&gt;(json) ?? new AppSettings();\n\n  \/\/ shallow copy to preserve SelectedObject binding\n  Settings.Environment = loaded.Environment;\n  Settings.RetryCount = loaded.RetryCount;\n  Settings.EnableAuditTrail = loaded.EnableAuditTrail;\n  Settings.Timeout = loaded.Timeout;\n  Settings.ThemeColor = loaded.ThemeColor;\n  Settings.ReportsFolder = loaded.ReportsFolder;\n\n  OnPropertyChanged(nameof(Settings));\n  Validate();\n}\n<\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Call Load() on startup, Save() on user action or exit.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:separator --><\/p>\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n<p><!-- \/wp:separator --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2 class=\"wp-block-heading\"><strong>Theming: make it brand-consistent and accessible<\/strong><\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>Pair WPF PropertyGrid with Pro Themes for WPF so your admin panel inherits consistent focus states, contrast, and typography\u2014especially important in dense settings UIs. It keeps your internal tools visually aligned with your product and cuts the time spent on polishing editor visuals.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:list --><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\"><!-- wp:list-item --><\/ul>\n<\/li>\n<\/ul>\n<p>\u00a0<\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>Explore Pro Themes for WPF to apply a cohesive, accessible theme across all controls.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><!-- \/wp:list-item --><\/p>\n<p><!-- wp:list-item --><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>If your configs affect data behaviors, consider DataGrid for WPF for high-performance reviews and batch edits.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><!-- \/wp:list-item --><\/p>\n<p><!-- \/wp:list --><\/p>\n<p><!-- wp:separator --><\/p>\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n<p><!-- \/wp:separator --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2 class=\"wp-block-heading\"><strong>Final result<\/strong><\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p>What you get: an admin\/config panel where new properties appear instantly, categorized and labeled, with sensible default editors and inline validation. Add a property to your POCO, restart, and it\u2019s live\u2014no custom dialog work.<\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p><strong>GIF-style walkthrough ideas<\/strong><\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:list --><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\"><!-- wp:list-item --><\/ul>\n<\/li>\n<\/ul>\n<p>\u00a0<\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>Add a new property to AppSettings, rebuild, and watch it appear in PropertyGrid with a default editor.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><!-- \/wp:list-item --><\/p>\n<p><!-- wp:list-item --><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>Change Environment via dropdown; validation overlays show live messages when values go out of range.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><!-- \/wp:list-item --><\/p>\n<p><!-- wp:list-item --><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>Click Save; a toast or inline message confirms settings persisted to JSON.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><!-- \/wp:list-item --><\/p>\n<p><!-- \/wp:list --><\/p>\n<p><!-- wp:separator --><\/p>\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n<p><!-- \/wp:separator --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2 class=\"wp-block-heading\"><strong>Paste-ready snippet: minimal PropertyGrid page<\/strong><\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p><strong>Code: Minimal page XAML<\/strong><\/p>\n<p><!-- \/wp:paragraph --><\/p>\n<p><!-- wp:code --><\/p>\n<pre class=\"wp-block-code\"><code>&lt;Page\n  xmlns=\"&lt;http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\/presentation&gt;\"\n  xmlns:x=\"&lt;http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml&gt;\"\n  xmlns:xcad=\"&lt;http:\/\/schemas.xceed.com\/wpf\/xaml\/toolkit&gt;\"&gt;\n  &lt;Grid Margin=\"16\"&gt;\n    &lt;Grid.RowDefinitions&gt;\n      &lt;RowDefinition Height=\"*\"\/&gt;\n      &lt;RowDefinition Height=\"Auto\"\/&gt;\n    &lt;\/Grid.RowDefinitions&gt;\n\n    &lt;xcad:PropertyGrid\n      SelectedObject=\"{Binding Settings}\"\n      AutoGenerateProperties=\"True\"\n      IsCategorized=\"True\"\n      NameColumnWidth=\"240\"\n      DescriptionVisibility=\"Visible\"\n      HelpVisible=\"True\"\/&gt;\n\n    &lt;StackPanel Grid.Row=\"1\" Orientation=\"Horizontal\" HorizontalAlignment=\"Right\" Margin=\"0,12,0,0\"&gt;\n      &lt;Button Content=\"Load\" Command=\"{Binding LoadCommand}\" Margin=\"0,0,8,0\"\/&gt;\n      &lt;Button Content=\"Save\" Command=\"{Binding SaveCommand}\"\/&gt;\n    &lt;\/StackPanel&gt;\n  &lt;\/Grid&gt;\n&lt;\/Page&gt;\n<\/code><\/pre>\n<p><!-- \/wp:code --><\/p>\n<p><!-- wp:separator --><\/p>\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n<p><!-- \/wp:separator --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2 class=\"wp-block-heading\"><strong>Internal links and related components<\/strong><\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:list --><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\"><!-- wp:list-item --><\/ul>\n<\/li>\n<\/ul>\n<p>\u00a0<\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>Pro Themes for WPF: apply consistent, accessible styling across all editors.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><!-- \/wp:list-item --><\/p>\n<p><!-- wp:list-item --><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>DataGrid for WPF: if configuration affects grid behavior (filters, formats, columns), pair with a fast, virtualized grid for admin views.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><!-- \/wp:list-item --><\/p>\n<p><!-- wp:list-item --><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>Support: <a href=\"https:\/\/xceed.com\/support\/\">https:\/\/xceed.com\/support\/<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><!-- \/wp:list-item --><\/p>\n<p><!-- \/wp:list --><\/p>\n<p><!-- wp:heading --><\/p>\n<h2 class=\"wp-block-heading\"><strong>Try It for yourself!<\/strong><\/h2>\n<p><!-- \/wp:heading --><\/p>\n<p><!-- wp:list --><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\"><!-- wp:list-item --><\/ul>\n<\/li>\n<\/ul>\n<p>\u00a0<\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>Grab the sample and start customizing: <a href=\"https:\/\/xceed.com\/trial\/\">https:\/\/xceed.com\/trial\/<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><!-- \/wp:list-item --><\/p>\n<p><!-- wp:list-item --><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>Questions about specific editors? Contact support: <a href=\"https:\/\/xceed.com\/support\/\">https:\/\/xceed.com\/support\/<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><!-- \/wp:list-item --><\/p>\n<p><!-- \/wp:list --><\/p>\n<p><!-- wp:paragraph --><\/p>\n<p><!-- \/wp:paragraph --><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Internal tools often ship with bare-minimum config screens and then rot: fields scatter across dialogs, validation is inconsistent, and adding new settings means weeks of UI plumbing. WPF PropertyGrid from Xceed\u2019s WPF Toolkit Plus is the silent time-saver that flips this script. You bind a POCO settings object, get production-ready editors instantly, then layer in custom editors, attributes, and validation as needed. Result: a consistent, branded, MVVM-friendly admin panel without a mountain of XAML.<\/p>","protected":false},"author":12,"featured_media":3158,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[141,60],"tags":[70,346,344,261,345,82],"class_list":["post-3157","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-all","category-tutorials","tag-net","tag-mvvm-configuration","tag-wpf-editors","tag-wpf-propertygrid","tag-wpf-toolkit-plus-propertygrid","tag-xceed"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Build a Configurable Admin Panel in WPF Using Toolkit Plus PropertyGrid - Xceed<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/xceed.com\/es\/blog\/tutoriales\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Build a Configurable Admin Panel in WPF Using Toolkit Plus PropertyGrid - Xceed\" \/>\n<meta property=\"og:description\" content=\"Internal tools often ship with bare-minimum config screens and then rot: fields scatter across dialogs, validation is inconsistent, and adding new settings means weeks of UI plumbing. WPF PropertyGrid from Xceed\u2019s WPF Toolkit Plus is the silent time-saver that flips this script. You bind a POCO settings object, get production-ready editors instantly, then layer in custom editors, attributes, and validation as needed. Result: a consistent, branded, MVVM-friendly admin panel without a mountain of XAML.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/xceed.com\/es\/blog\/tutoriales\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\/\" \/>\n<meta property=\"og:site_name\" content=\"Xceed\" \/>\n<meta property=\"article:published_time\" content=\"2025-09-17T16:40:45+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-18T13:15:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/xceed.com\/wp-content\/uploads\/2025\/09\/Wednesday-Sep-17.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"720\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Christopher Radford\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Christopher Radford\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\\\/\"},\"author\":{\"name\":\"Christopher Radford\",\"@id\":\"https:\\\/\\\/xceed.com\\\/fr\\\/#\\\/schema\\\/person\\\/79a6cce48b70a88e6701fef086d7c351\"},\"headline\":\"Build a Configurable Admin Panel in WPF Using Toolkit Plus PropertyGrid\",\"datePublished\":\"2025-09-17T16:40:45+00:00\",\"dateModified\":\"2025-09-18T13:15:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\\\/\"},\"wordCount\":499,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/xceed.com\\\/fr\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/xceed.com\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/Wednesday-Sep-17.png\",\"keywords\":[\".net\",\"MVVM configuration\",\"WPF editors\",\"WPF PropertyGrid\",\"WPF Toolkit Plus PropertyGrid\",\"xceed\"],\"articleSection\":[\"All\",\"Tutorials\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\\\/\",\"url\":\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\\\/\",\"name\":\"Build a Configurable Admin Panel in WPF Using Toolkit Plus PropertyGrid - Xceed\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/xceed.com\\\/fr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/xceed.com\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/Wednesday-Sep-17.png\",\"datePublished\":\"2025-09-17T16:40:45+00:00\",\"dateModified\":\"2025-09-18T13:15:15+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\\\/#primaryimage\",\"url\":\"https:\\\/\\\/xceed.com\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/Wednesday-Sep-17.png\",\"contentUrl\":\"https:\\\/\\\/xceed.com\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/Wednesday-Sep-17.png\",\"width\":1280,\"height\":720},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/xceed.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Build a Configurable Admin Panel in WPF Using Toolkit Plus PropertyGrid\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/xceed.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/xceed.com\\\/fr\\\/\",\"name\":\"Xceed\",\"description\":\"Provides tools for .NET, Windows Forms, WPF, Silverlight, and ASP.NET developers to create better applications.\",\"publisher\":{\"@id\":\"https:\\\/\\\/xceed.com\\\/fr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/xceed.com\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/xceed.com\\\/fr\\\/#organization\",\"name\":\"Xceed\",\"url\":\"https:\\\/\\\/xceed.com\\\/fr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/xceed.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/xceed.com\\\/wp-content\\\/uploads\\\/2024\\\/04\\\/cropped-xceed-logo.png\",\"contentUrl\":\"https:\\\/\\\/xceed.com\\\/wp-content\\\/uploads\\\/2024\\\/04\\\/cropped-xceed-logo.png\",\"width\":609,\"height\":150,\"caption\":\"Xceed\"},\"image\":{\"@id\":\"https:\\\/\\\/xceed.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/xceed.com\\\/fr\\\/#\\\/schema\\\/person\\\/79a6cce48b70a88e6701fef086d7c351\",\"name\":\"Christopher Radford\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/646a50aec7dd7187eab0ace3be81c465cdf54ce89b57357657f254b7cb1b996c?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/646a50aec7dd7187eab0ace3be81c465cdf54ce89b57357657f254b7cb1b996c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/646a50aec7dd7187eab0ace3be81c465cdf54ce89b57357657f254b7cb1b996c?s=96&d=mm&r=g\",\"caption\":\"Christopher Radford\"},\"sameAs\":[\"http:\\\/\\\/www.localhost:10003\"],\"url\":\"https:\\\/\\\/xceed.com\\\/es\\\/blog\\\/author\\\/radfordc\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Build a Configurable Admin Panel in WPF Using Toolkit Plus PropertyGrid - Xceed","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/xceed.com\/es\/blog\/tutoriales\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\/","og_locale":"es_MX","og_type":"article","og_title":"Build a Configurable Admin Panel in WPF Using Toolkit Plus PropertyGrid - Xceed","og_description":"Internal tools often ship with bare-minimum config screens and then rot: fields scatter across dialogs, validation is inconsistent, and adding new settings means weeks of UI plumbing. WPF PropertyGrid from Xceed\u2019s WPF Toolkit Plus is the silent time-saver that flips this script. You bind a POCO settings object, get production-ready editors instantly, then layer in custom editors, attributes, and validation as needed. Result: a consistent, branded, MVVM-friendly admin panel without a mountain of XAML.","og_url":"https:\/\/xceed.com\/es\/blog\/tutoriales\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\/","og_site_name":"Xceed","article_published_time":"2025-09-17T16:40:45+00:00","article_modified_time":"2025-09-18T13:15:15+00:00","og_image":[{"width":1280,"height":720,"url":"https:\/\/xceed.com\/wp-content\/uploads\/2025\/09\/Wednesday-Sep-17.png","type":"image\/png"}],"author":"Christopher Radford","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Christopher Radford","Est. reading time":"3 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/xceed.com\/blog\/tutorials\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\/#article","isPartOf":{"@id":"https:\/\/xceed.com\/blog\/tutorials\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\/"},"author":{"name":"Christopher Radford","@id":"https:\/\/xceed.com\/fr\/#\/schema\/person\/79a6cce48b70a88e6701fef086d7c351"},"headline":"Build a Configurable Admin Panel in WPF Using Toolkit Plus PropertyGrid","datePublished":"2025-09-17T16:40:45+00:00","dateModified":"2025-09-18T13:15:15+00:00","mainEntityOfPage":{"@id":"https:\/\/xceed.com\/blog\/tutorials\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\/"},"wordCount":499,"commentCount":0,"publisher":{"@id":"https:\/\/xceed.com\/fr\/#organization"},"image":{"@id":"https:\/\/xceed.com\/blog\/tutorials\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\/#primaryimage"},"thumbnailUrl":"https:\/\/xceed.com\/wp-content\/uploads\/2025\/09\/Wednesday-Sep-17.png","keywords":[".net","MVVM configuration","WPF editors","WPF PropertyGrid","WPF Toolkit Plus PropertyGrid","xceed"],"articleSection":["All","Tutorials"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/xceed.com\/blog\/tutorials\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/xceed.com\/blog\/tutorials\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\/","url":"https:\/\/xceed.com\/blog\/tutorials\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\/","name":"Build a Configurable Admin Panel in WPF Using Toolkit Plus PropertyGrid - Xceed","isPartOf":{"@id":"https:\/\/xceed.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/xceed.com\/blog\/tutorials\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\/#primaryimage"},"image":{"@id":"https:\/\/xceed.com\/blog\/tutorials\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\/#primaryimage"},"thumbnailUrl":"https:\/\/xceed.com\/wp-content\/uploads\/2025\/09\/Wednesday-Sep-17.png","datePublished":"2025-09-17T16:40:45+00:00","dateModified":"2025-09-18T13:15:15+00:00","breadcrumb":{"@id":"https:\/\/xceed.com\/blog\/tutorials\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/xceed.com\/blog\/tutorials\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/xceed.com\/blog\/tutorials\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\/#primaryimage","url":"https:\/\/xceed.com\/wp-content\/uploads\/2025\/09\/Wednesday-Sep-17.png","contentUrl":"https:\/\/xceed.com\/wp-content\/uploads\/2025\/09\/Wednesday-Sep-17.png","width":1280,"height":720},{"@type":"BreadcrumbList","@id":"https:\/\/xceed.com\/blog\/tutorials\/build-a-configurable-admin-panel-in-wpf-using-toolkit-plus-propertygrid\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/xceed.com\/"},{"@type":"ListItem","position":2,"name":"Build a Configurable Admin Panel in WPF Using Toolkit Plus PropertyGrid"}]},{"@type":"WebSite","@id":"https:\/\/xceed.com\/fr\/#website","url":"https:\/\/xceed.com\/fr\/","name":"Xceed","description":"Proporciona herramientas para que los desarrolladores de .NET, Windows Forms, WPF, Silverlight y ASP.NET puedan crear mejores aplicaciones.","publisher":{"@id":"https:\/\/xceed.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/xceed.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/xceed.com\/fr\/#organization","name":"Xceed","url":"https:\/\/xceed.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/xceed.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/xceed.com\/wp-content\/uploads\/2024\/04\/cropped-xceed-logo.png","contentUrl":"https:\/\/xceed.com\/wp-content\/uploads\/2024\/04\/cropped-xceed-logo.png","width":609,"height":150,"caption":"Xceed"},"image":{"@id":"https:\/\/xceed.com\/fr\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/xceed.com\/fr\/#\/schema\/person\/79a6cce48b70a88e6701fef086d7c351","name":"Christopher Radford","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/646a50aec7dd7187eab0ace3be81c465cdf54ce89b57357657f254b7cb1b996c?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/646a50aec7dd7187eab0ace3be81c465cdf54ce89b57357657f254b7cb1b996c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/646a50aec7dd7187eab0ace3be81c465cdf54ce89b57357657f254b7cb1b996c?s=96&d=mm&r=g","caption":"Christopher Radford"},"sameAs":["http:\/\/www.localhost:10003"],"url":"https:\/\/xceed.com\/es\/blog\/author\/radfordc\/"}]}},"_links":{"self":[{"href":"https:\/\/xceed.com\/es\/wp-json\/wp\/v2\/posts\/3157","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/xceed.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/xceed.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/xceed.com\/es\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/xceed.com\/es\/wp-json\/wp\/v2\/comments?post=3157"}],"version-history":[{"count":0,"href":"https:\/\/xceed.com\/es\/wp-json\/wp\/v2\/posts\/3157\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/xceed.com\/es\/wp-json\/wp\/v2\/media\/3158"}],"wp:attachment":[{"href":"https:\/\/xceed.com\/es\/wp-json\/wp\/v2\/media?parent=3157"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/xceed.com\/es\/wp-json\/wp\/v2\/categories?post=3157"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/xceed.com\/es\/wp-json\/wp\/v2\/tags?post=3157"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}