Linq-to-SQL 组合框绑定

Linq-to-SQL combobox binding

我正在尝试用以下方式从 linq to sql 检索到的 list of objects 填充 combobox items(这仅对我使用 select new 有效)。

请注意 Tax 参数与 select 新参数完全相同。

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>

现在我需要解析该值并检索在我填充的组合框中 selected 的税号。

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

并且由于 select new 创建新对象而出现以下错误。我想知道是否有任何方法可以解析最后一步以获取 Tax.Id 或在不 select new/创建新对象的情况下更好地填充。

Additional information: Unable to cast object of type '<>f__AnonymousType14[System.Int32,System.String,System.Nullable1[System.Decimal],System.String]' to type 'lilka.Tax'.

编辑:

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

使用此查询,我无法从 GUI 中的组合框项目列表中 select 项目。它只是没有显示为所选项目。

直接从查询中放入数据而不是创建新对象:

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

首先让我们谈谈您的 ComboBox:您应该使用 SelectedValuePath 属性 而不是 SelectedValue。所以:

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

这样在您的代码中 CbSettingsTax.SelectedValue 将 return 所选税对象的 ID 值,而 CbSettingsTax.SelectedItem 将 return 整个 选定对象。

关于 Linq-To-Sql,我看到你正在使用 "Query Syntax"。我个人更喜欢"Method Syntax"。当你写

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 个属性,分别称为 Id、Name、Percentage 和 Note。然后 LINQ 将 Tax 属性 值复制到新的 class 值中。

但是这个匿名类型与Tax类型不同。因此你不能将它转换为 Tax。实际上 taxes 是这种匿名类型的集合。它不是 Tax 对象的集合。

之前我告诉过你我更喜欢 LINQ "Method Syntax",因为每个 LINQ 方法 return 都是一个通用的 IEnumerable。 当然你可以用查询语法得到同样的结果,但是很容易出错。

如果你使用(例如):

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

您的组合框将有一个 Tax 对象集合作为 ItemsSource。

现在您只需要选择您的方法。您可以使用 "Method Syntax",然后从您的组合框中删除 SelectedValuePath 属性。另一方面,您可以继续使用 "Query Syntax",但在这种情况下,您必须使用 SelectedValuePath 属性,您的代码将是:

int id = (int)CbProductTax.SelectedValue;

希望对您有所帮助