将SortedList绑定到ListBox WPF

将SortedList绑定到ListBox WPF,wpf,vb.net,binding,listbox,sortedlist,Wpf,Vb.net,Binding,Listbox,Sortedlist,我正在将旧的.NET WinForms应用程序转换为WPF。它使用分类列表: Dim MyCol as New System.Collections.SortedList(New CaseInsensitiveComparer) 它通过迭代列表来填充表单中的列表框,即没有数据绑定 For Each p In MyCol.Values lstBox.Items.Add(p.Name, False) Next 这很好,因为项目出现在已排序的列表中。此外,由于它包含键、值对,您可以立即从列

我正在将旧的.NET WinForms应用程序转换为WPF。它使用分类列表:

Dim MyCol as New System.Collections.SortedList(New CaseInsensitiveComparer)
它通过迭代列表来填充表单中的列表框,即没有数据绑定

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)
我在应用程序中经常这样做,因此SortedList的“随机访问”特性对性能非常重要

所以,快进到WPF,我需要将我的列表框绑定到mycl,但如果可能的话,我希望将其作为一个分类列表。我怎样才能装订呢

编辑:为了进一步澄清,我正在尝试正确地使用MVVM。理想情况下,我会将(myClass的)ObservableCollection绑定到ListBox,并使用Linq对特定项进行排序和查询。但是,我已经失去了使用SortedList时的“随机访问”,我担心这会对性能造成重大影响。但我还没有弄清楚如何将SortedList转换为ObservableCollection(我很好,但不是很高级),所以我发布了这个问题,以探讨是否可以先使用SortedList,然后再放弃它,做其他事情

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

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

填充mycl后,我将其分配给如下属性。(SortedList.Values的类型为System.Collections.ICollection)

在XAML中,列表框绑定到它,如下所示:

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

这可以在MyCol SortedList中显示我的对象的Name属性。所以它有点像MVVM,虽然它不是一个可观察的集合。我必须看看我能在短时间内走多远,然后决定是否切换到一个真正的可观察集合,或者这是否可行

非常感谢,希望它能帮助遇到它的人。
Sandra

一种方法是简单地将SortedList设置为WPF列表框的ItemsSource,并使用Name属性作为DisplayMemberPath

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

尽管如此,您现在在执行WPF时还应该查看MVVM和绑定:)

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

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

是的,MVVM正是我想要达到的目标——很抱歉,我在问题中没有明确说明。我会编辑的。你让我意识到我可以直接绑定到mycl。我将编辑我的问题,以包括我最终做了什么。谢谢,但对我来说,改变分类列表是我希望避免的,至少在这个问题上。我编辑了我的问题以澄清目标。
new List<tuple<string,string>>()
myCol.OrderBy(p => p.Item2)