2015-02-06 71 views
0

我想填充combobox itemslist of objects,我從linq to sql檢索以下方式,(它只適用於我的select new)。Linq到SQL的組合框綁定

請注意Tax參數與選擇新參數完全相同。

dt = new LilkaDataContext(); 
var taxes = from p in dt.Taxes select new 
{ 
     Id = p.Id, 
     Name = p.Name, 
     Percentage = p.Percentage, 
     Note = p.Note 

}; 
cb.ItemsSource = taxes; 

XAML

<ComboBox Name="CbSettingsTax" Grid.Column="2" 
           SelectedValue="Id" 
           DisplayMemberPath="Name" > 
</ComboBox> 

現在我需要解析的價值和檢索中,我填充下拉框選擇的稅號。

int selectedTax = ((Tax)CbProductTax.SelectedItem).Id; 

由於創建新對象select new而得到以下錯誤。我想知道是否有任何方法來解析最後一步得到Tax.Id或更好地填充沒有select new /創建新的對象。

其他信息:無法轉換類型 '<> f__AnonymousType1 4[System.Int32,System.String,System.Nullable 1 [System.Decimal],System.String]' 的目的爲類型 'lilka.Tax'。

編輯:

dt = new LilkaDataContext(); 
var taxes = from p in dt.Taxes select p; 
cb.ItemsSource = taxes; 

使用此查詢我無法在GUI中選擇組合框項目列表項。它只是不顯示爲選定項目。

回答

1

首先,讓我們談談你的組合框:你應該使用SelectedValuePath屬性而不是SelectedValue。所以:

<ComboBox Name="CbSettingsTax" Grid.Column="2" 
           SelectedValuePath="Id" 
           DisplayMemberPath="Name" /> 

這樣在你的代碼CbSettingsTax.SelectedValue將返回選定的徵稅對象的ID值,而CbSettingsTax.SelectedItem將返回整個選定的對象。

關於Linq-To-Sql,我看你正在使用「查詢語法」。我個人更喜歡「方法語法」。當你寫

var taxes = from p in dt.Taxes select new 
{ 
     Id = p.Id, 
     Name = p.Name, 
     Percentage = p.Percentage, 
     Note = p.Note 
}; 

因爲你使用new關鍵字,編譯器會創建一個Anonimous Type,其中有4個屬性叫號,姓名,百分比和注意事項。然後LINQ複製新類類中的Tax屬性值。

但是這個不一致的類型與Tax類型不一樣。因此,您不能將它投射到Tax。確實,稅收是這種匿名類型的集合。它不是稅收對象的集合。

以前我告訴過你我更喜歡LINQ的「方法語法」,因爲每個LINQ方法都返回一個通用的IEnumerable。 當然,您可以使用查詢語法獲得相同的結果,但很容易出錯。

如果使用(例如):

dt = new LilkaDataContext(); 
cb.ItemsSource = dt.Taxes.Where(tax => tax.Name.Contains("VAT")); 

您的組合框將有稅收作爲對象的ItemsSource的集合。

現在你只需要選擇你的方法。您可以使用「方法語法」,然後從組合框中刪除SelectedValuePath屬性。在另一邊,你可以繼續使用「查詢語法」,但在這種情況下,你必須使用SelectedValuePath財產,你的代碼將是:

int id = (int)CbProductTax.SelectedValue; 

我希望它可以幫助你。

1

只要把數據直接從查詢,而不是創建一個新的對象:

所有的
dt = new LilkaDataContext(); 
var taxes = from p in dt.Taxes select p; 
cb.ItemsSource = taxes.ToList(); 
+0

感謝您的建議。我也嘗試過使用這種方法,但我無法從GUI中的Combobox項目列表中選擇項目。它只是不顯示爲選定項目。 – Marek 2015-02-07 00:15:11