1

これは Book クラスの Book{BookId, Title, Category, Quantity} です。 では、linq クエリを使用して各カテゴリから 1 つのオブジェクトのみを選択するにはどうすればよいでしょうか? 私はこのようにしてみました、

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

しかし、あなたはそれがうまくいかないことを知っています。これらのオブジェクトはすべて一意であるため、同じカテゴリが何度も表示されます。実際には GroupBy のようにしたいのですが、各グループからオブジェクトを 1 つだけ選択して、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() を呼び出す前に、Category を Select() する必要があります。

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 に答える