WPF DataGrid:如何将列绑定到方法而非属性以展示顶点属性?
实现DataGrid列绑定到Vertex的GetAttributeByName方法
要实现把DataGrid的每一列绑定到Vertex类的GetAttributeByName方法,核心思路是借助多值绑定(MultiBinding)搭配自定义转换器,把当前的Vertex对象和列对应的属性名一起传给方法,拿到返回的Attr值后再显示出来。下面是具体步骤:
1. 自定义多值转换器
首先需要写一个实现IMultiValueConverter的转换器类,它的作用是接收两个参数:当前的Vertex实例和目标属性名,然后调用GetAttributeByName方法获取对应的Attr,最后返回你要显示的Attr属性(比如假设Attr类有一个Value属性用来展示)。
using System; using System.Windows.Data; public class VertexAttributeConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { // 第一个参数是Vertex实例,第二个是属性名 if (values[0] is Vertex vertex && values[1] is string attrName) { var attr = vertex.GetAttributeByName(attrName); // 返回Attr的Value属性,如果为空可以返回默认值 return attr?.Value ?? "N/A"; } return null; } // 反向转换如果不需要可以直接返回null public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } }
2. 在XAML中配置DataGrid
接下来在XAML里先声明转换器资源,然后给每个DataGrid列配置MultiBinding,绑定到当前的Vertex对象和对应的属性名。
声明转换器资源
在Window或者UserControl的Resources里添加转换器:
<Window.Resources> <local:VertexAttributeConverter x:Key="VertexAttrConverter" /> </Window.Resources>
(注意local是你的项目命名空间,需要替换成实际的)
配置DataGrid列
每一列对应一个属性名,比如你要显示"Position"、"Color"这两个属性列,就这么写:
<DataGrid ItemsSource="{Binding YourVertexCollection}" AutoGenerateColumns="False"> <DataGrid.Columns> <!-- 对应Position属性 --> <DataGridTextColumn Header="Position"> <DataGridTextColumn.Binding> <MultiBinding Converter="{StaticResource VertexAttrConverter}"> <!-- 绑定当前的Vertex对象 --> <Binding /> <!-- 传递属性名作为静态参数 --> <Binding Source="Position" /> </MultiBinding> </DataGridTextColumn.Binding> </DataGridTextColumn> <!-- 对应Color属性 --> <DataGridTextColumn Header="Color"> <DataGridTextColumn.Binding> <MultiBinding Converter="{StaticResource VertexAttrConverter}"> <Binding /> <Binding Source="Color" /> </MultiBinding> </DataGridTextColumn.Binding> </DataGridTextColumn> </DataGrid.Columns> </DataGrid>
补充说明
- 如果你的
Attr类有其他需要展示的属性,直接修改转换器里的return attr?.XXX部分即可; - 如果需要支持编辑,你得完善
ConvertBack方法,把用户输入的值反向设置回Vertex的属性里; - 如果属性列是动态生成的(比如属性名从配置来),可以在后台代码里循环创建
DataGridColumn,同样给每个列配置MultiBinding即可。
内容的提问来源于stack exchange,提问作者Jeysym
相关产品推荐
相关产品推荐

