如何使用LINQ在ComboBox中显示不同的属性值?

时间:2012-11-26 20:13:02

标签: c# wpf linq dynamic-linq

这是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"/>
...

3 个答案:

答案 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()