/ / як показати чітке значення атрибута в ComboBox за допомогою LINQ? - c #, wpf, linq, dinami-linq

як показати відмінні значення атрибута в ComboBox за допомогою LINQ? - 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 для відповіді № 1
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>

2 для відповіді № 2

Хоча контекст цього коду не зрозумілий, взагалом, ви, ймовірно, повинні залишити дані DataContext ComboBox у спокої і прив'язати його властивість ItemsSource до властивості у вашій моделі перегляду, яка повертає ваш запит linq.

Це означає, що у вашому конкретному коді потрібно просто вибрати () категорію, перш ніж викликати Distinct ():

this.catagoryList.DataContext = ldc.Books.Select (книга => книга.Категорія) .Distinct ();

EDIT:

Просто видаліть свій DataTemplate, це не корисно. Якщо ви встановите свій DataContext для запиту LINQ вище, а потім прив’яжіть ItemsSource до DataContext, як це робите, він відобразить список рядків належним чином.


1 для відповіді № 3
ldb.Books.Select(b=>b.Category).Distinct()