2013-01-22 45 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(); 
    } 
} 

這並獲得成功。