我不确定如何说出标题。这是我正在寻找的,如果它可以在linq声明。
我有3个组合框,用户可以选择一个值。在每个组合框的SelectionChanged事件中,将过滤掉一个只能根据值填充另一个集合的observablecollection。组合框在顶部包含一个空白,供用户选择不在该列上应用过滤器。
有没有一种简单的方法可以使用linq来做到这一点?
希望我解释得那么清楚。
答案 0 :(得分:2)
你xaml可能是这样的:
<ComboBox x:Name="cmb1" SelectionChanged="Selector_OnSelectionChanged">
<ComboBox x:Name="cmb2" SelectionChanged="Selector_OnSelectionChanged">
<ComboBox x:Name="cmb3" SelectionChanged="Selector_OnSelectionChanged">
处理程序的代码:
var someCollection = new List<int>(); // some your collection
// stubs
Expression<Func<int, bool>> predicate1 = (x) => true;
Expression<Func<int, bool>> predicate2 = (x) => true;
Expression<Func<int, bool>> predicate3 = (x) => true;
// real predicates
if (cmb1.SelectedIndex >= 0)
predicate1 = (x) => x == (int)cmb1.SelectedValue;
if (cmb2.SelectedIndex >= 0)
predicate2 = (x) => x == (int)cmb2.SelectedValue;
if (cmb3.SelectedIndex >= 0)
predicate3 = (x) => x == (int)cmb3.SelectedValue;
// eval and out
lstBox.Items = someCollection.Where(predicate1)
.Where(predicate2)
.Where(predicate3)
.ToList();
我写了这个deatailed以便更清楚。
答案 1 :(得分:0)
我看不到你的代码所以也许我错了但你可以使用这种方法,每个SelectionChanged事件都使用这个代码:
yourCollection = (from c in yourCollection
where c.... (your conditions)
select c).ToList();
编辑:
使用一种方法处理所有更改:
private void UpdateCollection(ComboBox comboBox)
{
if (comboBox.Text != "")
{
values = (from c in yourCollection
where c.... (your conditions)
select c).ToList();
}
}
然后从每个SelectionChanged事件中调用它
private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
UpdateCollection(comboBox1);
}