这是Book类 预订{BookId,标题,类别,数量}; 那么,我如何使用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"/>
...
答案 0 :(得分: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>
答案 1 :(得分:2)
虽然此代码的上下文不明确,但一般情况下,您应该单独保留ComboBox的DataContext,并将其ItemsSource属性绑定到视图模型中返回linq查询的属性。
那就是说,在您的特定代码中,您只需在调用Distinct()之前选择()类别:
this.catagoryList.DataContext = ldc.Books.Select(book =&gt; book.Category).Distinct();
编辑:
只需删除您的DataTemplate,它就没用了。如果将DataContext设置为上面的LINQ查询,然后将ItemsSource绑定到DataContext,它将正确显示字符串列表。
答案 2 :(得分:1)
ldb.Books.Select(b=>b.Category).Distinct()