将 SortedList 绑定到 ListBox WPF

Bind a SortedList to ListBox WPF

我正在将旧版 .NET WinForms 应用程序转换为 WPF。它使用 SortedList:

Dim MyCol as New System.Collections.SortedList(New CaseInsensitiveComparer)

它通过迭代列表来填充表单中的ListBox,即没有数据绑定。

For Each p In MyCol.Values
    lstBox.Items.Add(p.Name, False)
Next

很好,因为项目出现在排序的列表中。此外,因为它包含键值对,您可以立即从列表中获取所需的对象,或者查看它是否在列表中:

If MyCol.Contains("the key") ...

myObject = MyCol("the key")
Debug.Print(myObject.Name)

我在应用程序中经常这样做,因此 'random access' SortedList 的性质对于性能非常重要。

所以,快进到 WPF,我需要将我的 ListBox 绑定到 MyCol,但如果可能的话,我想将它保留为 SortedList。怎么绑定?

编辑:为了进一步澄清,我正在尝试正确地做,并且想使用 MVVM。理想情况下,我会将 ObservableCollection(属于 myClass)绑定到 ListBox,并使用 Linq 对特定项目进行排序和查询。但是后来我丢失了 SortedList 中的 'random access',我担心这会对性能造成重大影响。但是我一直无法弄清楚如何将 SortedList 转换为 ObservableCollection(我很好,但不是超级高级),所以我发布了这个问题来探索是否有可能在放弃之前先坚持使用 SortedList它是为了别的。

我最终做了什么,至少对于初学者来说:

在我的 ViewModel 中,我有一个类型为 System.Collections.ICollection 的依赖项 属性。我们称它为 MyColProperty。

填充 MyCol 后,我将它分配给 属性,就像这样。 (SortedList.Values 属于 System.Collections.ICollection 类型)。

MyColProperty = MyCol.Values

在 XAML 中,ListBox 像这样绑定到它:

<ListBox ItemsSource="{Binding MyColProperty}" DisplayMemberPath="Name"></ListBox>

这可以在 MyCol SortedList 中显示我的对象的名称 属性。所以它有点像 MVVM,尽管它不是一个可观察的集合。我将不得不看看我能在这个缺点上走多远,然后决定是切换到真正的 ObservableCollection,还是这样做。

非常感谢,希望对遇到的人有所帮助。 桑德拉

一种方法是简单地将 SortedList 设置为 WPF ListBox 的 ItemsSource,并将名称 属性 用作 DisplayMemberPath。

lstBox.ItemsSource = MyCol;
lstBox.DisplayMemberPath = "Name";

尽管如此,您现在在执行 WPF 时还应该研究 MVVM 和 Binding :)

将您的集合 MyCol 作为键和值的集合,可能类似于,

new List<tuple<string,string>>()

然后使用 DisplayMemberPath 作为 Item2 将您的 listBox 绑定到此集合,并使用 Item one 作为搜索等的关键字。

您还可以使用 LINQ 对列表进行排序,

myCol.OrderBy(p => p.Item2)