当用户选择SelectedValue
中的某个项目时,我必须处理ListBox
属性更改以刷新某些相关的UI元素。我使用SelectedValue
因为我需要知道项目的具体值,而不是ListBox
中的索引(索引在各种情况下可能不同)或其他东西。我的ListBox
绑定到DataTable
,SelectedValue
包含表格中行的ID。
问题在于,当我尝试在SelectedValue
事件处理程序中获取ListBox
SelectionChanged
时,我会收到先前值,不是目前!因此,在我花了大约一个小时寻找解决这个问题的方法之后,我注意到它是相对众所周知的,但我看到的解决方案似乎并不十分清楚。尽管如此,我还是将我遇到的一些想法“编译”到下一个工作代码片段中:
((DataRowView)this.LISTBOXNAME.SelectedItem)["ID"]
其中this
是我当前的窗口,而SelectedItem
可以投放到DataRowView
,因为ListBox
绑定到DataTable
,如前所述。这行代码给出了所选ListBoxItem
的正确值。
但无论如何,我仍然想知道如何让SelectedValue
直接获得正确的价值?可能吗?或者,也许,我必须使用另一个事件(不是SelectionChanged
)吗?如果这是不可能的,有人可以向我解释一下微软那些善良的人的想法以及为什么这个属性有这样的特征?
答案 0 :(得分:2)
SelectedValueChanged
事件可以正常获取正确的SelectedValue
属性,因此我认为问题可能出在您的列表框设置方式上。
您说它已绑定到DataTable
,因此您的集合中的项目是DataRowView
个对象。
如果您将SelectedValuePath
设置为"Id"
,那么SelectedValue
媒体资源会尝试将SelectedValue
设置为DataRowView.Id
,而我{39}} ; t认为是有效的财产。
这里你的两个选择是
构建具有适当属性的对象集合,以用于SelectedValue
<ListBox ItemsSource="{Binding MyCollection}"
SelectedValue="{Binding SelectedId}"
SelectedValuePath="Id" ... />
其中MyCollection
是一组对象,每个对象都包含.Id
属性。
或者使用SelectedItem
代替SelectedValue
,并像现在一样使用DataRowView
个对象。 SelectedItem
将设置为您的集合中的所选项目,其类型为DataRowView
,因此您发布的代码就是如何访问它。
((DataRowView)this.LISTBOXNAME.SelectedItem)["ID"]
在这两者中,WPF通常首选第一种方法。
修改:以下是your question in the comments的回答,因为它太长而无法发表评论。
ListBox
意味着绑定到一组项目。将ItemsSource设置为DataTable
时,您实际上是绑定到DataRowView
个对象的集合。
有三种方法可以从此处获取所选项目:SelectedItem
,SelectedIndex
和SelectedValue
。
SelectedItem
返回您选择的对象。在这种情况下,这是DataRowView
对象,这就是您可以将其强制转换为DataRowView的原因。
SelectedIndex
返回数据源中所选项目的索引。
SelectedValue
属性时,才能使用 SelectedValuePath
。 SelectedValuePath
告诉WPF每个数据对象上的哪个属性包含&#34; Value&#34;该项目,因此如果您将其设置为"Id"
,它将尝试在每个对象上找到.Id
属性。在您的情况下,对象DataRowView
上没有包含您的Id列数据的有效属性,因此这不起作用。
希望能回答你的问题:)