繁体   English   中英

如何正确处理ListBox中的SelectedValue更改(WPF,C#)?

[英]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绑定到DataTableSelectedItem可能会强制转换为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种方法可以从此处获取所选项目: SelectedItemSelectedIndexSelectedValue

  • SelectedItem返回您SelectedItem的对象。 在这种情况下,这就是DataRowView对象,这就是为什么可以将其强制转换为DataRowView的原因。

  • SelectedIndex返回您在数据源中所选项目的索引。

  • SelectedValue如果您还设置了只能用SelectedValuePath财产。 SelectedValuePath告诉WPF每个数据对象上的哪个属性包含该项目的“值”,因此,如果将其设置为类似"Id" ,它将尝试在每个对象上查找.Id属性。 在您的情况下,对象DataRowView上没有包含ID列数据的有效属性,因此这不起作用。

希望这能回答你的问题 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM