PropertyGrid显示嵌套对象

 简介:

     在C#中,使用PropertyGrid来显示多重变量,通常意味着你想要展示一个对象的属性,该对象包含子对象或者集合。以下是一个简单的例子,展示如何使用PropertyGrid来显示包含嵌套属性的对象。

使用:

  嵌套对象加上如下代码

[TypeConverter(typeof(ExpandableObjectConverter))]

例子: 

public class User
{
    public string Name { get; set; }
    public int Age { get; set; }
    [TypeConverter(typeof(ExpandableObjectConverter))]
    public Address HomeAddress { get; set; }
}
 
public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
    public string ZipCode { get; set; }
}

C# WPF 中,`PropertyGrid` 是一个非常有用的控件,尤其适用于展示和编辑对象属性。尽管 WPF 原生并没有内置的 `PropertyGrid` 控件(与 WinForm 的 `PropertyGrid` 同),但可以通过使用第三方库或自定义实现来完成似功能。 ### 使用第三方库:`Xceed.Wpf.Toolkit.PropertyGrid` 一个广泛使用的解决方案是 [Xceed WPF Toolkit](https://github.com/xceedsoftware/wpftoolkit),它提供了一个功能强大的 `PropertyGrid` 控件。 #### 安装方法 通过 NuGet 安装 `Xceed.Wpf.Toolkit`: ```bash Install-Package Xceed.Wpf.Toolkit ``` #### XAML 中引入命名空间 在你的 XAML 文件中添加以下命名空间声明: ```xml <Window xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" x:Class="YourNamespace.MainWindow" Title="MainWindow" Height="450" Width="800"> <Grid> <xctk:PropertyGrid x:Name="propertyGrid1" /> </Grid> </Window> ``` #### 设置数据源 你可以将任意对象赋值给 `PropertyGrid` 来显示其公共属性。例如: ```csharp public class Person { public string Name { get; set; } public int Age { get; set; } public DateTime BirthDate { get; set; } } // 在窗口加载时设置 PropertyGrid 数据源 public MainWindow() { InitializeComponent(); var person = new Person { Name = "张三", Age = 30, BirthDate = new DateTime(1993, 1, 1) }; propertyGrid1.SelectedObject = person; } ``` #### 多对象支持 如果需要同时展示多个对象属性,可以使用 `SelectedObjects` 属性[^3]: ```csharp propertyGrid1.SelectedObjects = new object[] { new Person(), new Address() }; ``` 其中 `Person` 和 `Address` 是两个同的,它们的公共属性都会被显示。 --- ### 自定义 PropertyGrid 实现 如果你希望依赖第三方库,也可以通过绑定到 `ItemsControl` 或 `DataGrid` 实现一个简单的属性展示器。 #### 示例:使用反射获取属性并绑定 ```csharp public class PropertyItem { public string Name { get; set; } public object Value { get; set; } } // 获取对象的所有属性并封装成集合 private List<PropertyItem> GetProperties(object obj) { var properties = new List<PropertyItem>(); foreach (var prop in obj.GetType().GetProperties()) { properties.Add(new PropertyItem { Name = prop.Name, Value = prop.GetValue(obj) }); } return properties; } ``` XAML 中绑定: ```xml <DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="名称" Binding="{Binding Name}" /> <DataGridTextColumn Header="值" Binding="{Binding Value}" /> </DataGrid.Columns> </DataGrid> ``` 代码后台设置 DataContext: ```csharp dataGrid.ItemsSource = GetProperties(person); ``` --- ### 总结 - 使用 `Xceed.Wpf.Toolkit.PropertyGrid` 是最直接且功能丰富的选择。 - 若需轻量级方案,可通过反射 + `DataGrid` 实现基础属性展示。 - 支持单对象和多对象显示,并可扩展为支持编辑功能。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值