如何在WPF MVVM中显示带有动态列的表格

问题描述 投票:0回答:1

我有一个对象列表,每个对象都包含用户定义的属性。这些属性的键和值是自由字符串,因此它们在对象之间不一定一致。无论如何,我想在表格中显示我的所有对象。

每行一个对象,每列一个属性键,每个单元格一个属性值,如下所示:

名字 年龄 最喜欢的水果 最喜欢的颜色 城市
约翰 21 蓝色 伦敦
凤梨 红色 巴黎
保罗 22 香蕉 绿色
帕特里夏 23 凤梨 伊斯坦布尔

我有一个自定义对象负责读取属性并将它们存储在字典中并且我的模型视图存储此类字典的列表。我想将此字典列表链接到我的 WPF 控件。

稍后,列需要可按属性值排序和分组(如 Excel 小计)

我什至不知道从哪里开始?自定义数据网格视图?自定义列表视图?

wpf gridview data-binding
1个回答
0
投票

DataTable 对象是获取动态数据的方法。您必须通过执行以下操作来转换它:

    public partial class DataGridFromDictionary : Window
    {
        public DataTable Table { get; set; }
        public DataGridFromDictionary()
        {
            var attributeDictionaries = new List<Dictionary<string, string>>()
            {
                new Dictionary<string, string>()
                {
                    {"name", "john" },
                    {"age", "21" },
                    {"favourite color", "blue" },
                    {"city", "london" },
                },                new Dictionary<string, string>()
                {
                    {"name", "jane" },
                    {"favourite fruit", "ananas" },
                    {"favourite color", "red" },
                    {"city", "paris" },
                },
            };

            Table = CovertToDataTable(attributeDictionaries);

            InitializeComponent();
            DataContext = this;
        }

        public DataTable CovertToDataTable(List<Dictionary<string, string>> dynamicObjects)
        {
            DataTable table = new DataTable();

            foreach(var attributeDictionary in dynamicObjects)
            {
                // add any missing columns
                foreach (var attribute in attributeDictionary.Keys)
                {
                    if (!table.Columns.Contains(attribute))
                    {
                        table.Columns.Add(attribute);
                    }
                }

                // create the new row
                var dr = table.NewRow();

                foreach (var attribute in attributeDictionary)
                {
                    dr[attribute.Key] = attribute.Value;
                }

                table.Rows.Add(dr);
            }

            return table;
        }
    }

    <Grid>
        <DataGrid ItemsSource="{Binding Table}" />
    </Grid>

结果:

© www.soinside.com 2019 - 2024. All rights reserved.