WPF VB.net ListBox如何获取所选项目索引或排序&相对于项目来源的分组列表

时间:2011-02-12 20:04:44

标签: wpf vb.net listbox

晚上好,

首先感谢您花时间阅读本文。 我在排序和排序方面遇到了一些困难。 WPF vb.net 3.5中的分组列表框,其项目源绑定到ObservableCollection。

我希望能够做的是从ObservableCollection项目源中检索一段数据,具体取决于用户选择的列表框中的项目。

我几乎让它工作但是因为列表框已经排序,它与项目源的索引不匹配。

这是我到目前为止的代码:

Dim i As Integer = lstBox1.Items.IndexOf(lstBox1.SelectedItem)
MessageBox.Show(myListSource.Item(i).Description.ToString, "Source Description")

正如我之前提到的,因为lstBox已经排序,并且分组的索引也不匹配。

根据列表框中的选定项目,是否有人知道如何从列表来源获取我想要的正确信息?

再次,非常感谢你的时间,

罗布

3 个答案:

答案 0 :(得分:3)

您可以将ItemsSource绑定到ObservableCollection<Foo>并将SelectedItem绑定到Foo的实例。

这样,您已经删除了对列表索引的依赖 - 您可以按照自己的意愿进行分组和排序 - 通过选择列表中的项目,您支持类中的当前实例(可能是ViewModel)将通过绑定。

看起来应该是这样的

<ListBox
    ItemsSource="{Binding MyCollection}"
    SelectedItem="{Binding CurrentSelection}" />

并在代码(ViewModel)中充当视图的DataContext ...

Private _myCollection As ObservableCollection(Of Foo)
Public Property MyCollection As ObservableCollection(Of Foo)
Get
    Return _myCollection
End Get

Private _currentItem As Foo
Public Property CurrentItem As Foo
Get
    Return _currentItem
End Get
Set(ByVal value As Foo)
    Me._currentItem = value
End Set

(如果我的vb语法错误,请道歉)

因此,如果您需要访问ViewModel中的ListBox SelectedItem,您只需使用CurrentItem属性...

MessageBox.Show(CurrentItem.Description.ToString, "Source Description")

答案 1 :(得分:0)

我不熟悉VB.NET,但是你可以将lstBox1.SelectedItem转换为你期望的类型,然后直接从中得到描述。

Dim foo As Foo = TryCast(lstBox1.SelectedItem, Foo)

If foo IsNot Nothing Then
    MessageBox.Show(foo.Dsecription, "Source Description")
End If

答案 2 :(得分:0)

为什么不将SelectedItem强制转换为源集合中的类型?

MessageBox.Show(DirectCast(lstBox1.SelectedItem, MyType).Description.ToString, "Source Description")