2011-02-04 21 views
0

我的c#WPF應用程序我在運行時將列添加到DataGrid中,並通過LINQ從我的SQL db中填充。這是工作的罰款,直到我試圖從添加數據我許多一對多表LINQ多對多WPF數據綁定路徑

這裏的3個相關表格的簡化版本,我的數據庫:

documents: document_id, title 
documents_keywords: document_id, keyword_id, value 
keywords: keyword_id, name 

我想在我的DataGrid是什麼列對於document.title,根據用戶選擇爲document.documents_keywords中的每個記錄添加一列。這裏是我的代碼:

 DataGrid dataGrid = new DataGrid(); 
     dataGrid.Columns.Add(new DataGridTextColumn 
     { 
      Header = "Title", 
      Binding = new Binding("title") 
     }); 
     foreach (string keywordName in keywordsListBox.SelectedItems) 
     { 
      dataGrid.Columns.Add(new DataGridTextColumn 
      { 
       Header = keywordName, 
       Binding = new Binding("documents_keywords.FirstOrDefault(kw => kw.keyword.name.Equals(\""+keywordName+"\")).value") 
      }); 
     } 

     dataGrid.ItemsSource = from d in db.documents select d; 

我得到的關鍵字標題,但單元格都是空白的。在FirstOr默認綁定失敗:

System.Windows.Data Error: 40 : BindingExpression path error: 'FirstOrDefault(d_k => d_k.keyword.name.Equals("Order#"))' property not found on 'object' ''EntityCollection`1' (HashCode=7935090)'. BindingExpression:Path=documents_keywords.FirstOrDefault(d_k => d_k.keyword.name.Equals("Order#")).value; DataItem='document' (HashCode=5781744); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String') 

要達到此目的的最佳方法是什麼?原諒我,因爲這是我第一次進入WPF和LINQ。

回答

0

我試着重寫你的代碼,但這不是一件容易的事,我不確定它是否有效。 我已將每列的綁定設置爲數組Keywords["+i+"]"而不是documents_keywords.FirstOrDefault(的順序索引,並已更改ItemSource的結構。

我沒有機會親自檢查此代碼,因此如果您有任何問題 - 請將它們寫入評論部分。

DataGrid dataGrid = new DataGrid(); 
    dataGrid.Columns.Add(new DataGridTextColumn 
    { 
     Header = "Title", 
     Binding = new Binding("title") 
    }); 
    //all possible keywords 
    var items = db.keywords.Select(k => new {Id = k.keyword_id, Name = k.name}).ToArray(); 
    //selected keywords ordered by id 
    var selected = (from item in items 
        where keywordsListBox.SelectedItems.Contains(item.Name) 
        orderby item.Id 
        select item) 
        .ToArray(); 
    //create columns and bind them 
    for(int i = 0; i < selected.Length; i++) 
    { 
     dataGrid.Columns.Add(new DataGridTextColumn 
     { 
      Header = selected[i].Name, 
      Binding = new Binding("Keywords["+i+"]") 
     }); 
    } 

    var documents = (from d in db.documents 
        select new{ 
         d.title, 
         //All related keywords 
         Keywords = d.documents_keywords.Select(dk => 
             new { Id = dk.keywoard_id, Value = dk.value}) 
             .ToList()}) 
        .AsEnumerable() 
        .Select(doc => new { 
         title = doc.title, 
         //Only selected keywords with default null values 
         Keywords = (from si in selected 
            join k in doc.Keywords on si.Id equals k.Id into j 
            from ji in j.DefaultIfEmpty(new { Id = si.Id, Value = null}) 
            orderby ji.Id 
            select ji.Value) 
            .ToArray() 
         }); 
    dataGrid.ItemsSource = documents.ToList(); 
+0

對於遲到的反應感到遺憾 - 這個項目遠遠沒有列入優先事項清單,我只是回到它。你的解決方案錯誤在最後一行,但考慮到複雜性,我想我會嘗試一種不同的方法。謝謝! – codeManJones 2011-03-22 19:06:28