2015-02-06 73 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