【问题标题】:DataGrid Horizontal BindingDataGrid 水平绑定
【发布时间】:2013-01-22 15:11:43
【问题描述】:

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

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

    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 的属性,在第二种方法中被赋值)

我使用模型是因为我也有正负值的设置器,以防万一,你知道如何解决这个问题吗?

【问题讨论】:

  • 离题评论,当你真正知道对象的类型时,请不要使用 Var,例如,你有一个始终是数据表的 var,一个始终是一行的 var,一个始终是 statisticpersonalizedvalue 的 var ...
  • @RhysW 我不同意。如果您有KeyValuePair&lt;MyVeryLongNameClass,MyOtherVeryLongNameClass&gt; 怎么办?它在代码中产生了很多不必要的混乱。我更喜欢使用 var。
  • 在某些情况下它可能会造成混乱(这通常可以通过适当的代码格式来避免),但由于多种原因,它通常是不好的编码习惯,其中之一是它更难用于其他当您寻求帮助时,人们会遵循您的代码...

标签: c# wpf silverlight


【解决方案1】:

好的,解决了。

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

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

这成功了。

【讨论】:

    猜你喜欢
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2012-06-27
    • 2014-11-01
    相关资源
    最近更新 更多