最快上手,三步驟:
System.Windows.Forms.dll。xmlns:my="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"。WindowsFormsHost 包裹。<WindowsFormsHost Height="287" Width="200">
<my:PropertyGrid x:Name="PropertyGrid1" />
</WindowsFormsHost>

CodePlex 專案 WPG,純 WPF 控件,無需宿主。
<Window ... xmlns:wpg="clr-namespace:WPG;assembly=WPG">
<DockPanel>
<Button x:Name="btn" DockPanel.Dock="Top">button for test</Button>
<wpg:PropertyGrid DockPanel.Dock="Top" Instance="{Binding ElementName=btn}" />
</DockPanel>
</Window>

Workflow Designer 內建的屬性檢視器即為高階 PropertyGrid,五步驟封裝:
WpfPropertyGrid : Grid。WorkflowDesigner 私有欄位。Designer.PropertyInspectorView 加入 Children。RefreshPropertyList、OnSelectionChanged、SelectionTypeLabel。SelectedObject 屬性處理選擇變更。public class WpfPropertyGrid : Grid
{
private WorkflowDesigner Designer;
private MethodInfo RefreshMethod, OnSelectionChangedMethod;
private TextBlock SelectionTypeLabel;
private object TheSelectedObject;
public object SelectedObject
{
get => TheSelectedObject;
set
{
TheSelectedObject = value;
if (value != null)
{
var context = new EditingContext();
var mtm = new ModelTreeManager(context);
mtm.Load(value);
var selection = Selection.Select(context, mtm.Root);
OnSelectionChangedMethod.Invoke(Designer.PropertyInspectorView, new object[] { selection });
SelectionTypeLabel.Text = value.GetType().Name;
}
else
{
OnSelectionChangedMethod.Invoke(Designer.PropertyInspectorView, new object[] { null });
SelectionTypeLabel.Text = string.Empty;
}
}
}
public string FontAndColorData
{
set => Designer.PropertyInspectorFontAndColorData = value;
}
public WpfPropertyGrid()
{
Designer = new WorkflowDesigner();
var inspector = Designer.PropertyInspectorView;
inspector.Visibility = Visibility.Visible;
Children.Add(inspector);
var t = inspector.GetType();
var flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly;
RefreshMethod = t.GetMethod("RefreshPropertyList", flags);
OnSelectionChangedMethod = t.GetMethod("OnSelectionChanged", flags);
SelectionTypeLabel = t.GetMethod("get_SelectionTypeLabel", flags).Invoke(inspector, null) as TextBlock;
SelectionTypeLabel.Text = string.Empty;
}
public void RefreshPropertyList() => RefreshMethod.Invoke(Designer.PropertyInspectorView, new object[] { false });
}

| 方案 | 優點 | 缺點 |
|---|---|---|
| WinForms 宿主 | 零學習成本、功能完整 | 跨進程渲染、樣式難統一 |
| WPG 開源控件 | 純 WPF、易客製化 | 社群維護狀態需確認 |
| WF4 PropertyInspector | 原生高效能、VS 級體驗、支援字型/色彩主題 | 依賴 Workflow 組件、反射較脆弱 |
完整 Demo 下載:WpfPropertyGrid_Demo.rar