【发布时间】:2010-12-29 04:54:03
【问题描述】:
我正在使用由 ListView 和一些 ComboBoxes 组成的 MVVM 设计模式创建一个 WPF 应用程序。 ComboBoxes 用于过滤 ListView。我想要完成的是用相关 ListView 列中的项目填充组合框。换句话说,如果我的 ListView 有 Column1、Column2 和 Column3,我希望 ComboBox1 显示 Column1 中的所有 UNIQUE 项。一旦在 ComboBox1 中选择了一个项目,我希望根据 ComboBox1 的选择过滤 ComboBox2 和 ComboBox3 中的项目,这意味着 ComboBox2 和 ComboBox3 只能包含有效的选择。如果在 ASP.NET 中使用 AJAX 工具包,这将有点类似于 CascadingDropDown 控件,除了用户可以随机选择任何 ComboBox,而不是按顺序。
我的第一个想法是将 ComboBoxes 绑定到 ListView 绑定的同一个 ListCollectionView,并将 DisplayMemberPath 设置为适当的列。就将 ListView 和 ComboBoxes 一起过滤而言,这非常有效,但它会显示 ComboBox 中的所有项目,而不仅仅是唯一的项目(显然)。所以我的下一个想法是使用 ValueConverter 只返回唯一的项目,但我没有成功。
仅供参考:我在CodeProject 上阅读了 Colin Eberhardt 关于向 ListView 添加自动过滤器的帖子,但他的方法循环遍历整个 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 对您不起作用吗?
-
克里斯,在我的 ValueConverter 中,我尝试使用 LINQ 语句返回唯一项目,但我无法弄清楚如何查询 ListCollectionView 中的一列...我不确定如果可能的话。即使有可能,当在另一个 ComboBox 中进行选择时,ValueConverter 如何知道“刷新”列表?有什么想法吗?
标签: wpf listview mvvm combobox filter