【问题标题】:WPF filtering ListView removes Selected ItemsWPF 过滤 ListView 删除选定项
【发布时间】:2017-01-23 18:35:36
【问题描述】:

我正在努力过滤列表视图。我尝试了 2 种方法来过滤而不删除选定的项目。 My issue: whenever an selected item disappers because of the filter, it is no longer selected when it comes back. 我的方法:

自写代码:

            try
        {

            string s = isci_tb.Text;
            if (isci_tb.Text == "")
            {
                osebe_listView.Items.Clear();
                foreach (Oseba o in seznamOseb)
                {
                    osebe_listView.Items.Add(o);
                }
            }
            else
            {
                osebe_listView.Items.Clear();
                foreach (Oseba o in seznamOseb)
                {
                    if (contejns(o.ime, s) || contejns(o.priimek, s) || contejns(o.mobilnaSt.ToString(), s) || contejns(o.posta, s) || contejns(o.nazivPodjetja, s) || contejns(o.stacionarnaSt.ToString(), s) || contejns(o.naslov, s) || contejns(o.eMail, s))
                    {
                        osebe_listView.Items.Add(o);
                    }
                }
            }
        }
        catch { }

它的作用是搜索所有项目并仅显示与过滤器匹配的项目,但此方法完全删除项目并重新添加它们。 我尝试为所选项目添加一个值,该值保存 onSelectionChanged 并在更改过滤器时使用,但它不起作用。

第二种方法来自this tutorial.,我希望它会起作用,因为它使用了过滤器,但显然它也有同样的问题。

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    您可以尝试根据Oseba 的某些属性设置ListViewItems 的Visibility。然后,而不是

    osebe_listView.Items.Clear();
    foreach (Oseba o in seznamOseb)
    {
        if (someConditions)
        {
           osebe_listView.Items.Add(o);
        }
    }
    

    你可以这样写:

    foreach (Oseba o in seznamOseb)
    {
        if (someConditions) // when true, we want to hide the object
        {
           o.IsVisible = false;
        }
    }
    

    并在您的 .xaml 文件中使用 DataTemplate,当 IsVisible 设置为 false 时,它​​将项目的 Visibility 设置为 Collapsed

    另一种方法是将IsSelected-state 存储在您的对象Oseba 中,这样当您删除该对象并将其重新添加到您的listView 时,选择状态是持久的。

    【讨论】:

    • 如果 Oseba 中没有 o.isVisible 属性,我该如何设置?我认为您想将不等于过滤器对象设置为可见 = false,对吗?我怎么能那样做?我现在正在尝试
    • 我假设您可以控制类 Oseba 并且您可以在其上定义一个属性“IsVisible”。
    • Oseba 只是一个数据类,它有属性,显示在 ListView 中
    • 我向“Oseba”添加了一个 IsSelected 属性,该属性在 osebe_listView_SelectionChanged 方法中进行了更改。我用 var sel = e.AddedItems; var des = e.RemovedItems;改变财产。现在的问题是,当项目由于过滤器而被删除时,它也被设置为 false。有什么想法吗?
    • 很难说,可能有很多地方出了问题。我建议您编辑您的问题并提供更完整的代码示例,以便我和其他人可以提供更好的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 2018-01-09
    相关资源
    最近更新 更多