Я создаю приложение WPF, используя шаблон проектирования MVVM, который состоит из ListView и некоторых ComboBox. ComboBoxes используются для фильтрации ListView. Я пытаюсь заполнить поле со списком элементами из связанного столбца ListView. Другими словами, если в моем ListView есть Column1, Column2 и Column3, я хочу, чтобы ComboBox1 отображал все элементы UNIQUE в Column1. После того, как элемент выбран в ComboBox1, я хочу, чтобы элементы в ComboBox2 и ComboBox3 фильтровались на основе выбора ComboBox1, что означает, что ComboBox2 и ComboBox3 могут содержать только действительные выборки. Это было бы чем-то похоже на элемент управления CascadingDropDown при использовании набора инструментов AJAX в ASP.NET, за исключением того, что пользователь может выбрать любой ComboBox случайным образом, а не по порядку.
Моя первая мысль заключалась в том, чтобы привязать ComboBoxes к тому же 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>