You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:43:47