标题可能有误,但不是,请继续阅读。
我需要一个动态数据网格,因此我使用此方法创建列,这样就可以选择"选择"要显示的列:
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的属性,在第二种方法中被赋值)
我正在使用模型,因为我也有正面值和负值的设置器以防万一,您对如何解决这个问题有任何想法吗?
答案 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();
}
}
这就是诀窍。