0

标题可能有误,但不是,请继续阅读。

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

    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 个动态列。

因此,我通过构建自定义 DataTable 来动态生成 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)

我将 StatisticPersonalizedValue 的命名空间作为文本

        Binding = new Binding("Value")

我得到空字符串(值是 StatisticPersonalizedValue 的属性,在第二种方法中被赋值)

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

4

1 回答 1

0

好的,解决了。

我必须添加一个自定义转换器

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();
    }
}

这成功了。

于 2013-01-22T16:14:32.960 回答