WPF Linq包含或排除项目的集合

时间:2013-12-10 04:02:39

标签: c# wpf linq

我不确定如何说出标题。这是我正在寻找的,如果它可以在linq声明。

我有3个组合框,用户可以选择一个值。在每个组合框的SelectionChanged事件中,将过滤掉一个只能根据值填充另一个集合的observablecollection。组合框在顶部包含一个空白,供用户选择不在该列上应用过滤器。

有没有一种简单的方法可以使用linq来做到这一点?

希望我解释得那么清楚。

2 个答案:

答案 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);
    }