将本地数组的值绑定到所有列表框项目的特定 属性(可见性)

Binding values from local array to specific property (Visibility) of all listbox items

我需要根据更改某些过滤器来更改代码中列表框中所有项目的可见性。我尝试使用

循环项目
    myListbox.ContainerFromIndex(i)

但只有前几个没有 return null。为什么我很快在这里找到了答案:

Why ItemContainerGenerator.ContainerFromIndex() returns null and how to avoid this behavior?

关闭虚拟化对我来说看起来不是一个值得尊敬的解决方案,而且在调用 ContainerFromIndex 之前滚动每个项目以查看我也不太满意,即使它可能有效。

我对处理绑定和依赖属性等的其余主题不是很聪明,也许还因为它们中的大多数是用 xaml 而不是代码编写的。但我很确定答案应该在那里。我是 c# 的新手,我没有找到任何明确的解决方案来解决这样一个基本问题。

我会准备像这样的可见性数组

    Visibility[] visibilities=new Visibility[100]
    ...

并且我希望包含 100 个项目的 myListBox 使用这些值。要么自动使用一些 c# 魔法,要么像我以前在 Win32 中做的那样在一个循环中。

根据Depechie的评论,我针对collections进行了研究,并创建了一个功能代码。这是我所做的:

而不是通过

直接将项目添加到列表框
  lbGames.Items.Add(...)

我创建了两个集合:

    List<object> gameList=new List<object>();
    ObservableCollection<object> filteredGameList = new ObservableCollection<object>();

以这种方式添加项目:

    gameList.Add(...); or filteredGameList.Add(...)

虽然 gameList 包含所有项目(堆栈面板),但 filteredGameList 仅包含我希望可见的项目。我在仅使用一个使用其可见性的大集合时遇到了一些问题 属性,也许是我的错误,也许不是。

没有 ObservableCollection,我无法重绘列表框,这是另一个 List<> 保存过滤数据的问题。当我过滤数据时,我首先清除 filteredGameList,然后添加我希望可见的所有项目,从不更改可见性 属性。 ObservableCollection 总是在项目更改时通知列表框。

在应用程序初始化时,我将列表框附加到这个 filteredGamesList。

    lbGames.ItemsSource = filteredGameList;

现在一切正常。