2013-01-22 46 views
0

标题可能有误,但不是,请继续阅读。DataGrid水平装订

我需要一个动态的数据网格,所以我用这个方法,得到了“选择”列显示生成列:

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

所以我动态地构建地方行的列由键映射像以前的自定义数据表生成的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

一个脱离主题的评论,请不要在你真正了解对象类型时使用Var,例如你有一个vars总是一个数据表,一个vars总是一行,一个vars总是一个统计人格化值... – RhysW

+0

@ RhysW我不同意。如果你有'KeyValuePair ',怎么办?它在代码中造成了很多不必要的混乱。我更喜欢使用var。 –

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

这并获得成功。