【问题标题】:WPF Linq a collection to include or exclude itemsWPF Linq 包含或排除项目的集合
【发布时间】:2013-12-10 04:02:38
【问题描述】:

我不确定如何用词来形容标题。如果在 linq 语句中可能,这就是我正在寻找的内容。

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

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

希望我解释得足够清楚。

【问题讨论】:

  • 当然,linq 可以帮助您。组合是使用不同的 SelectionChanged 处理程序还是相同?
  • 让他们都触发同一个事件似乎更有意义

标签: c# wpf linq


【解决方案1】:

你的 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();

为了更清楚,我写的很详细。

【讨论】:

    【解决方案2】:

    我看不到您的代码,所以也许我错了,但您可以使用这种方法,每个 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);
        }
    

    【讨论】:

    • 我目前没有任何东西可以处理它。我不确定如何编写如果值为空则不包含在语句中的语句
    • 您可以简单地使用 if 语句,如果您可以用一种方法处理所有更改,我将更新我的代码,希望对您有所帮助
    猜你喜欢
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 2014-03-08
    相关资源
    最近更新 更多