Я создаю приложение WPF, используя шаблон проектирования MVVM, который состоит из ListView и некоторых ComboBox. ComboBox используются для фильтрации ListView. То, что я пытаюсь сделать, это заполнить выпадающий список элементами в связанном столбце ListView. Другими словами, если у моего ListView есть Column1, Column2 и Column3, я хочу, чтобы ComboBox1 отображал все уникальные элементы в Column1. После того, как элемент выбран в ComboBox1, я хочу, чтобы элементы в ComboBox2 и ComboBox3 были отфильтрованы на основе выбора ComboBox1, что означает, что ComboBox2 и ComboBox3 могут содержать только допустимые значения. Это будет несколько похоже на элемент управления CascadingDropDown при использовании инструментария AJAX в ASP.NET, за исключением того, что пользователь может выбирать любой ComboBox случайным образом, а не по порядку.
Моей первой мыслью было связать ComboBox с тем же ListCollectionView, с которым связан ListView, и установить для DisplayMemberPath соответствующий столбец. Это прекрасно работает, когда идет совместная фильтрация ListView и ComboBox, но отображает все элементы в ComboBox, а не только уникальные (очевидно). Поэтому моей следующей мыслью было использование ValueConverter, чтобы возвращать только уникальные элементы, но я не добился успеха.
К вашему сведению: я прочитал статью Колина Эберхардта о добавлении автофильтра в ListView на CodeProject , но его метод просматривает каждый элемент во всем ListView и добавляет уникальные элементы в коллекцию. Хотя этот метод работает, кажется, что он будет очень медленным для больших списков.
Любые предложения о том, как добиться этого элегантно? Спасибо!
Пример кода:
<ListView ItemsSource="{Binding Products}" SelectedItem="{Binding SelectedProduct}">
<ListView.View>
<GridView>
<GridViewColumn Header="Item" Width="100" DisplayMemberBinding="{Binding ProductName}"/>
<GridViewColumn Header="Type" Width="100" DisplayMemberBinding="{Binding ProductType}"/>
<GridViewColumn Header="Category" Width="100" DisplayMemberBinding="{Binding Category}"/>
</GridView>
</ListView.View>
</ListView>
<StackPanel Grid.Row="1">
<ComboBox ItemsSource="{Binding Products}" DisplayMemberPath="ProductName"/>
<ComboBox ItemsSource="{Binding Products}" DisplayMemberPath="ProductType"/>
<ComboBox ItemsSource="{Binding Products}" DisplayMemberPath="Category"/>
</StackPanel>