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

时间:2015-02-18 19:13:21

标签: c# .net wpf listbox selectedvalue

当用户选择SelectedValue中的某个项目时,我必须处理ListBox属性更改以刷新某些相关的UI元素。我使用SelectedValue因为我需要知道项目的具体值,而不是ListBox中的索引(索引在各种情况下可能不同)或其他东西。我的ListBox绑定到DataTableSelectedValue包含表格中行的ID。

问题在于,当我尝试在SelectedValue事件处理程序中获取ListBox SelectionChanged时,我会收到先前值,不是目前!因此,在我花了大约一个小时寻找解决这个问题的方法之后,我注意到它是相对众所周知的,但我看到的解决方案似乎并不十分清楚。尽管如此,我还是将我遇到的一些想法“编译”到下一个工作代码片段中:

((DataRowView)this.LISTBOXNAME.SelectedItem)["ID"]

其中this是我当前的窗口,而SelectedItem可以投放到DataRowView,因为ListBox绑定到DataTable,如前所述。这行代码给出了所选ListBoxItem的正确值。

但无论如何,我仍然想知道如何让SelectedValue直接获得正确的价值?可能吗?或者,也许,我必须使用另一个事件(不是SelectionChanged)吗?如果这是不可能的,有人可以向我解释一下微软那些善良的人的想法以及为什么这个属性有这样的特征?

1 个答案:

答案 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个对象的集合。

有三种方法可以从此处获取所选项目:SelectedItemSelectedIndexSelectedValue

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

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

  • 只有在您设置了SelectedValue属性时,才能使用
  • SelectedValuePathSelectedValuePath告诉WPF每个数据对象上的哪个属性包含&#34; Value&#34;该项目,因此如果您将其设置为"Id",它将尝试在每个对象上找到.Id属性。在您的情况下,对象DataRowView上没有包含您的Id列数据的有效属性,因此这不起作用。

希望能回答你的问题:)