数据网格水平绑定

本文关键字:绑定 水平 网格 数据网 数据 | 更新日期: 2023-09-27 17:55:17

标题可能弄错了,但不是,请继续阅读。

我需要一个动态数据网格,所以我使用此方法创建列,该方法获取要显示的"选定"列:

    public void ConfigureGridColumns()
    {
        App.Instance.MainWindow.grdDetail.mainGrd.Columns.Clear();
        var stats = new List<Statistic>();
        stats.AddRange(App.Instance.Manager.PersonalizeStatistics.OrderBy(x => x.Index).Where(x => x.Selected).Select(x => x.Statistic));
        foreach (var stat in stats)
        {
            var column = new DataGridTextColumn
            {
                Header = stat.Name,
                Binding = new Binding(stat.Key)
            };
        }
    }

现在,我不想创建一个包含所有列的模型,因为我有 150 多个动态列。

因此,我通过构建自定义数据表来动态生成 ItemsSource,其中行的列由键映射,就像以前一样:

        private void ConfigureGridSource()
        {
        var dt = new DataTable("stats");
        foreach (var player in App.Instance.Manager.Players.Values.Take(5))
        {
            var row = dt.NewRow();
            foreach (var stat in stats)
            {
                if (!dt.Columns.Contains(stat.Statistic.Key))
                    t.Columns.Add(stat.Statistic.Key, typeof(StatisticPersonalizedValue));
                var persStat = new StatisticPersonalizedValue(stat);
                persStat.Value = player.Statistics[stat.Statistic.Key];
                row[stat.Statistic.Key] = persStat;
            }
            dt.Rows.Add(row);
        }
        grdDetail.mainGrd.ItemsSource = CollectionViewSource.GetDefaultView(dt.DefaultView);
        }

问题是:

        Binding = new Binding(stat.Key)

我以文本形式获取统计个性化值的命名空间

        Binding = new Binding("Value")

我得到空字符串(值是统计个性化值的属性,在第二种方法中被值)

我正在使用模型,因为我也有正值和负值的设置器,以防万一,您对如何解决这个问题有任何想法吗?

数据网格水平绑定

好的,解决了这个问题。

我不得不添加一个自定义转换器

Binding = new Binding(stat.Key) { Converter = new StatisticPersonalizedValueConverter() }

public class StatisticPersonalizedValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is StatisticPersonalizedValue)
        {
            return (value as StatisticPersonalizedValue).Value;
        }
        return string.Empty;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

这成功了。