1

这是 Book 类 Book{BookId, Title, Category, Quantity}; 那么,如何使用 linq 查询从每个类别中仅选择一个对象?我试过这样,

this.catagoryList.DataContext = ldc.Books.Distinct(); //categoryList is a ComboBox

但你知道它不起作用。所有这些对象都是独一无二的,因此它多次显示相同的类别。实际上我希望它像 GroupBy,但我想从每个组中只选择一个对象以在 ComboBox 中显示唯一的类别。谢谢。

XAML:

    <DataTemplate x:Key="CatagoryTemplate">
          <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding Path=Catagory}"/>
          </StackPanel>
    </DataTemplate>
...
 <ComboBox Name="catagoryList" ItemsSource="{Binding}" ItemTemplate="{StaticResource CatagoryTemplate}" SelectionChanged="catagoryList_SelectionChanged" IsSynchronizedWithCurrentItem="True"/>
...
4

3 回答 3

3
this.catagoryList.DataContext = ldc.Books.Select(b => b.Category).Distinct();

如果您不想更改模板:

catagoryList.DataContext = ldc.Books.Select(b => b.Category)
                                    .Distinct()
                                    .Select(c => new { Catagory = c });

但我认为最好更改模板以匹配字符串。

<DataTemplate x:Key="CatagoryTemplate">
      <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding}"/>
      </StackPanel>
</DataTemplate>
于 2012-11-26T20:15:06.663 回答
2

虽然这段代码的上下文不清楚,但一般来说,您应该不理会 ComboBox 的 DataContext 并将其 ItemsSource 属性绑定到视图模型中返回 linq 查询的属性。

也就是说,在您的特定代码中,您只需在调用 Distinct() 之前选择()类别:

this.catagoryList.DataContext = ldc.Books.Select(book=>book.Category).Distinct();

编辑:

只需删除您的 DataTemplate,它没有用。如果您将 DataContext 设置为上面的 LINQ 查询,然后按照您的操作将 ItemsSource 绑定到 DataContext,它将正确显示字符串列表。

于 2012-11-26T20:20:43.877 回答
1
ldb.Books.Select(b=>b.Category).Distinct()
于 2012-11-26T20:14:38.360 回答