【发布时间】: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<MyVeryLongNameClass,MyOtherVeryLongNameClass>怎么办?它在代码中产生了很多不必要的混乱。我更喜欢使用 var。 -
在某些情况下它可能会造成混乱(这通常可以通过适当的代码格式来避免),但由于多种原因,它通常是不好的编码习惯,其中之一是它更难用于其他当您寻求帮助时,人们会遵循您的代码...
标签: c# wpf silverlight