Я создаю приложение WPF с использованием шаблона проектирования MVVM, который состоит из ListView и некоторых ComboBoxes. ComboBox используются для фильтрации ListView. То, что я пытаюсь выполнить, - это заполнить поле со списком элементов в соответствующем столбце ListView. Другими словами, если в моем ListView есть столбцы Column1, Column2 и Column3, я хочу, чтобы ComboBox1 отображал все UNIQUE элементы в столбце 1. Как только элемент выбран в ComboBox1, я хочу, чтобы элементы в ComboBox2 и ComboBox3 были отфильтрованы на основе выбора ComboBox1, что означает, что ComboBox2 и ComboBox3 могут содержать только допустимые варианты выбора. Это будет несколько похоже на элемент управления CascadingDropDown, если вы используете набор инструментов AJAX в ASP.NET, за исключением того, что пользователь может выбрать любой ComboBox случайным образом, а не по порядку.Элементы combobox для фильтра WPF на основе элементов ListView
Моя первая мысль заключалась в том, чтобы связать ComboBoxes с тем же списком ListCollectionView, с которым связан ListView, и установить DisplayMemberPath в соответствующий столбец. Это отлично работает, поскольку фильтрация ListView и ComboBoxes происходит вместе, но он отображает все элементы в ComboBox, а не только уникальные (очевидно). Поэтому моя следующая мысль заключалась в том, чтобы использовать ValueConverter только для возврата только уникальных элементов, но я не был успешным.
FYI: Я прочитал сообщение Колина Эберхардта о добавлении AutoFilter в 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>
Можете ли вы объяснить, почему с помощью ValueConverter не работает для вас ? –
Chris, В моем ValueConverter я пытаюсь вернуть уникальные элементы с помощью оператора LINQ, но мне не удалось выяснить, как запросить один столбец в ListCollectionView ... Я не уверен, что это даже возможно. Даже если это возможно, как ValueConverter знает, что «обновит» список, когда будет выбран выбор в другом ComboBox? Есть предположения? – Brent