【问题标题】:Difference between SelectedItem, SelectedValue and SelectedValuePathSelectedItem、SelectedValue 和 SelectedValuePath 之间的区别
【发布时间】:2011-06-21 14:00:07
【问题描述】:

以下有什么区别:

所有这些依赖属性都在Selector 类中定义。我经常将SelectedItemSelectedValue 混淆,将SelectedValueSelectedValuePath 混淆。

我想知道它们之间的区别,以及我们什么时候使用它们,尤其是SelectedValueSelectedValuePath。请用一些简单的例子解释它们的用途

【问题讨论】:

标签: wpf silverlight xaml selecteditem selectedvalue


【解决方案1】:

他们的名字可能有点混乱:)。总结如下:

  • SelectedItem 属性返回列表绑定到的整个对象。因此,假设您已将列表绑定到 Category 对象的集合(每个 Category 对象都具有 Name 和 ID 属性)。例如。 ObservableCollection<Category>SelectedItem 属性将返回当前选定的 Category 对象。但是,出于绑定目的,这并不总是您想要的,因为这仅使您能够将整个 Category 对象绑定到列表绑定到的属性,而不是该 Category 对象上单个属性的值(例如它的 @ 987654327@ 财产)。

  • 因此,我们将 SelectedValuePath 属性和 SelectedValue 属性作为另一种绑定方式(您可以将它们结合使用)。假设您有一个 Product 对象,您的视图绑定到该对象(具有 ProductName、Weight 等属性)。假设您在该 Product 对象上有一个 CategoryID 属性,并且您希望用户能够从类别列表中选择该产品的类别。您需要将 Category 对象的 ID 属性分配给 Product 对象的 CategoryID 属性。这就是SelectedValuePathSelectedValue 属性的用武之地。您指定Category 对象上的ID 属性应分配给使用SelectedValuePath='ID' 将列表绑定到的Product 对象上的属性,然后绑定SelectedValue 属性到 DataContext 上的属性(即产品)。

下面的例子证明了这一点。我们有一个绑定到类别列表的组合框(通过 ItemsSource)。我们将 Product 上的 CategoryID 属性绑定为选定值(使用 SelectedValue 属性)。我们通过 SelectedValuePath 属性将此与类别的 ID 属性相关联。我们说的是仅在 ComboBox 中显示 Name 属性,并带有 DisplayMemberPath 属性)。

<ComboBox ItemsSource="{Binding Categories}" 
          SelectedValue="{Binding CategoryID, Mode=TwoWay}" 
          SelectedValuePath="ID" 
          DisplayMemberPath="Name" />
public class Category
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class Product
{
    public int CategoryID { get; set; }
}

一开始有点混乱,但希望这能让它更清楚一点...:)

克里斯

【讨论】:

  • 感谢您的解释。你是那个写过关于 Silverlight 的书的人吗?我不相信我在和你说话。 :-)...我现在正在读这本书。真是一部了不起的作品。 :-)
  • 是的,就是我 :)。我会在这里闲逛这些部分,以尽可能回答问题。很高兴你喜欢这本书:)。既然你已经拿到了这本书,你会在第 69-70 页和第 204 页找到关于这个主题的更多信息。
  • +1。 +100。先生,您是次等人物中的黄金之神。愿上帝保佑你,以及所有在你里面航行的人。 :) 说真的,我花了两个小时试图弄清楚 - 谢谢!
  • 我很欣赏这个答案所付出的努力,但老实说,读完它后我几乎和以前一样困惑。 IMO,this other SO answer 更清晰。
  • @StevenRands 感谢您分享指向其他回复的链接。我也同意你的看法。 For methis response 比 @Chris 的回复更好、更简洁、更容易理解。我说for me,因为我们都有不同的理解事物的方式。也许,Chriss 的回复对其他一些读者来说更容易理解——因此,我也赞成Chriss 的回复。
【解决方案2】:

从概念上回答一点:

SelectedValuePath 定义绑定到 ListBox 的 ItemsSource 的对象的哪个属性(按其名称)将用作项目的 SelectedValue

例如,如果您的 ListBox 绑定到 Person 对象的集合,每个对象都有 NameAgeGender 属性,SelectedValuePath=Name 将导致选定的 @987654331 的值@ 的Name 属性将在SelectedValue 中返回。

请注意,如果您覆盖 ListBox 的 ControlTemplate(或应用样式)来指定应显示的属性,则无法使用 SelectedValuePath

SelectedItem 同时返回当前选中的整个Person 对象。

(这里是 a further example from MSDN,使用 TreeView)

更新:正如@Joe 指出的,DisplayMemberPath 属性与 Selected* 属性无关。其正确的描述如下:

请注意,这些值不同于 DisplayMemberPath(在 ItemsControl 上定义,而不是在 Selector 上定义),但该属性与 SelectedValuePath 具有相似的行为:在没有样式/模板的情况下,它标识了绑定到 item 的对象应用作其字符串表示形式。

【讨论】:

    【解决方案3】:

    SelectedItem 是一个objectSelectedValueSelectedValuePathstrings。

    例如使用列表框:

    如果你说给我listbox1.SelectedValue,它将返回当前选定项目的文本。

    string value = listbox1.SelectedValue;
    

    如果你说给我listbox1.SelectedItem,它会给你整个对象。

    ListItem item = listbox1.SelectedItem;
    string value = item.value;
    

    【讨论】:

    • SelectedValue 也是 object 而不是 string。请参阅here
    【解决方案4】:

    受这个问题的启发,我连同code snippet here 一起写了一篇博客。以下是博客的部分摘录

    SelectedItem – Selected Item 有助于绑定将要显示的 DataSource 中的实际值。这是对象类型,我们可以将任何从对象类型派生的类型与此属性绑定。由于我们将在这种情况下为组合框使用 MVVM 绑定,因此我们可以使用该属性来通知 VM 已选择项目。

    SelectedValue 和 SelectedValuePath – 这是组合框最容易混淆和误解的两个属性。但是,当我们想将组合框与已创建对象的值绑定时,这些属性就会派上用场。请查看以下列表中的最后一个场景,以简要了解这些属性。

    【讨论】:

      【解决方案5】:

      每个使用集合存储数据的控件都有 SelectedValue、SelectedItem 属性。这些控件的示例是 ListBox、Dropdown、RadioButtonList、CheckBoxList。

      更具体地说,如果你真的想检索所选项目的文本,那么你可以这样写:

      ListBox1.SelectedItem.Text;
      

      如果 value 之前已设置为,您的 ListBox1 也可以使用 SelectedValue 属性返回 Text。但上面是更有效的获取文本的方法。

      现在,该值对用户来说是不可见的,但它主要用于存储在数据库中。我们不插入 ListBox1 的文本,但我们也可以插入它,但我们习惯于插入所选项目的值。为了获得价值,我们可以使用

      ListBox1.SelectedValue
      

      Source

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-25
        • 2020-05-10
        相关资源
        最近更新 更多