[英]How to handle SelectedValue changing in ListBox correctly (WPF, C#)?
当用户在ListBox
选择某些项目时,我必须处理SelectedValue
属性更改以刷新一些依赖的UI元素。 我使用SelectedValue
是因为我需要知道项目的具体值,而不是ListBox
的索引(在各种情况下索引可能有所不同)或其他内容。 我的ListBox
绑定到DataTable
并且SelectedValue
包含表中一行的ID。
问题是,当我尝试在SelectionChanged
事件处理程序中获取ListBox
SelectedValue
时,我收到了一个先前的值, 而不是当前值! 因此,在花了大约一个小时寻找解决此问题的方法之后,我注意到它相对知名,但是我所看到的解决方案似乎并不十分清楚。 不过,我将“我遇到的一些想法”“编译”到了下一个工作代码段:
((DataRowView)this.LISTBOXNAME.SelectedItem)["ID"]
this
是我当前的窗口,并且如前所述,当ListBox
绑定到DataTable
, SelectedItem
可能会强制转换为DataRowView
。 此行代码为选定的ListBoxItem
提供适当的值。
但是无论如何,我仍然想知道如何使SelectedValue
直接获得正确的值 ? 可能吗? 或者,也许我必须使用另一个事件(不是SelectionChanged
)吗? 如果不可能,那么有人可以向我解释微软的好心人的思考方式,以及为什么该资产具有这种功能吗?
SelectedValueChanged
事件可以很好地获取正确的SelectedValue
属性,因此我认为问题可能出在您的列表框的设置方式上。
您说已将其绑定到DataTable
,因此集合中的项目是DataRowView
对象。
如果将SelectedValuePath
设置为"Id"
,则SelectedValue
属性将尝试将SelectedValue
设置为DataRowView.Id
,我认为这不是有效的属性。
您的两种选择是
建立具有适当属性的对象集合,以用于SelectedValue
<ListBox ItemsSource="{Binding MyCollection}" SelectedValue="{Binding SelectedId}" SelectedValuePath="Id" ... />
其中MyCollection
是对象的集合,每个对象包含一个.Id
属性。
或使用SelectedItem
代替SelectedValue
,并像现在一样使用DataRowView
对象。 SelectedItem
将被设置为您集合中DataRowView
类型的所选项目,因此您发布的代码是如何访问它的。
((DataRowView)this.LISTBOXNAME.SelectedItem)["ID"]
在这两种方法中,WPF通常首选第一种方法。
编辑:这是您在以下评论中的问题的答案,因为它太长了,无法放入评论中。
ListBox
旨在绑定到项目集合。 当将ItemsSource设置为DataTable
,实际上是绑定到DataRowView
对象的集合。
有3种方法可以从此处获取所选项目: SelectedItem
, SelectedIndex
和SelectedValue
。
SelectedItem
返回您SelectedItem
的对象。 在这种情况下,这就是DataRowView
对象,这就是为什么可以将其强制转换为DataRowView的原因。
SelectedIndex
返回您在数据源中所选项目的索引。
SelectedValue
如果您还设置了只能用SelectedValuePath
财产。 SelectedValuePath
告诉WPF每个数据对象上的哪个属性包含该项目的“值”,因此,如果将其设置为类似"Id"
,它将尝试在每个对象上查找.Id
属性。 在您的情况下,对象DataRowView
上没有包含ID列数据的有效属性,因此这不起作用。
希望这能回答你的问题 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.