DataGrid水平绑定

时间:2013-01-22 15:11:43

标签: c# wpf silverlight

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

我需要一个动态数据网格,因此我使用此方法创建列,这样就可以选择"选择"要显示的列:

    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")

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

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

1 个答案:

答案 0 :(得分: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();
    }
}

这就是诀窍。