це клас 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 для відповіді № 1this.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()