我将旧的.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
很不错,因为列表中的项目已排序。此外,因为它包含Key,Value对,您可以立即从列表中获取所需的对象,或者查看它是否在列表中:
If MyCol.Contains("the key") ...
myObject = MyCol("the key")
Debug.Print(myObject.Name)
我在应用中做了很多,所以随机访问' SortedList的性质对于性能非常重要。
所以,快进到WPF,我需要将我的ListBox绑定到MyCol,但是如果可能的话,我希望将它保存为SortedList。我怎么绑它?
编辑:为了进一步澄清,我正在努力做到并且想要使用MVVM。理想情况下,我将ObservableCollection(myClass)绑定到ListBox,并使用Linq对特定项进行排序和查询。但后来我失去了随机访问权限#39;我对SortedList有所了解,我担心这会对性能产生重大影响。但我还没有弄清楚如何将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中显示我的对象的Name属性。所以它是一种MVVM,虽然它不是一个可观察的集合。我必须看看我能用这个短路来接受它,然后决定是否切换到真正的ObservableCollection,或者是否会这样做。
非常感谢,并希望它可以帮助遇到它的人。 桑德拉
答案 0 :(得分:0)
一种方法是简单地将SortedList设置为WPF ListBox的ItemsSource,并将Name属性用作DisplayMemberPath。
lstBox.ItemsSource = MyCol;
lstBox.DisplayMemberPath = "Name";
然而,你现在应该在做WPF时考虑MVVM和Binding:)
答案 1 :(得分:0)
将您的收藏集MyCol作为键和值的集合,可能类似于
new List<tuple<string,string>>()
然后将ListBox绑定到此集合,并将DisplayMemberPath绑定为Item2,并使用Item one作为搜索等的键。
您也可以使用LINQ对列表进行排序,
myCol.OrderBy(p => p.Item2)