zoukankan      html  css  js  c++  java
  • WPF Selector、SelectIndex、SelectedValue、SelectedValuePath、SelectedItem这几兄弟你分的清楚嘛?

    Selector

    Selector是一个抽象类,继承ItemsControl类(包含任何类型的对象(例如字符串,图像或面板)的集合),而本文的4个兄弟都是Selector类下的4个属性。

    SelectIndex

    SelectIndex的作用是

    获取或设置当前选择项中第一项的索引,如果选择项为空,则返回负数(-1)
    大致理解成将集合像数据那样排序,index就是序号,根据序号设置获取选中项。
    以下代码表示选择索引为0也就是默认选中第一项。

    <ListBox Margin="10,0,0,5" SelectedIndex="0"
      Name="listBox1" VerticalAlignment="Top" Grid.Column="0" Grid.Row="4">
      <ListBoxItem>Item 0</ListBoxItem>
      <ListBoxItem>Item 1</ListBoxItem>
      <ListBoxItem>Item 2</ListBoxItem>
      <ListBoxItem>Item 3</ListBoxItem>
    </ListBox>
    

    SelectedItem

    SelectedItem作用是
    获取或设置当前选定项目或null没有当前选定项目的对象。

    注意,是整个对象
    如果数据源是Collection< Class>,那么SelectedItem就是Class 的对象。我们可以通过SelectedItem来获取对象的相关属性。

    但是,如果我仅仅只需要Id一个属性,那么通过SelectedItem是不是过于浪费了呢?所以为了满足这项需求,SelectedValue和 SelectedValuePath应运而生。

    SelectedValue和 SelectedValuePath

    假设数据源是Collection< Class>,如果需要获取Id,我们只需要将数据源绑定后,SelectedValuePath=“id” ,SelectedValue={Binding yourProperty}即可。
    有点千万注意:
    SelectedValue属性是用来获取选中值的,并不是为了设置,设置就算双向绑定也是无法更改绑定控件Text的只有SelectedItem可以。

    DisplayMemberPath

    作用:
    源对象上的值的路径。这可以是任何路径,也可以是XPath,例如“ @Name”。默认值为空字符串(“”),设置后会对应绑定数据源对应的属性名称。
    通俗来说,就是设置要显示的路径,例如

    <ComboBox ItemsSource="{Binding Human}"
              SelectedValue="{Binding ID, Mode=TwoWay}"
              SelectedValuePath="ID"
              DisplayMemberPath="Name" />
    

    DisplayMemberPath="Name,下拉框显示路径是Human.Name.

    IsSynchronizedWithCurrentItem

    作用:
    获取或设置一个值,该值指示Selector是否应保持Items属性中当前项目与SelectedItem同步。
    这个属性是bool?类型,设置是否同步当前选中项。

    即如果有两个combobox设置了IsSynchronizedWithCurrentItem=“True”,当你选择其中一个,另外一个会自动变化。

    <ListBox Name="employeeListBox1"
             ItemsSource="{Binding Source={StaticResource Employees}}"
             ItemTemplate="{StaticResource EmployeeItemTemplate}"
             IsSynchronizedWithCurrentItem="True"/>
    
    <ListBox Name="employeeListBox2"
             ItemsSource="{Binding Source={StaticResource Employees}}"
             ItemTemplate="{StaticResource EmployeeItemTemplate}"
             IsSynchronizedWithCurrentItem="True"/>
    

    实际运用要点:

    以下是使用心得

    尽量不要SelectedItem和SelectedValue一起用,会先加载SelectedItem后加载SelectedValue,如果你的SelectedValue没有指定值,它会更改SelectedItem的值为null。

    双向绑定情况下,SelectIndex和SelectedValue SelectedItem一起用时,SelectIndex会先执行,SelectedValue、SelectedItem后执行,最后数据显示决定于SelectedItem或SelectedValue

    SelectedValue只有在控件初始化时设置的初始值会更改显示Text,后续在后台更改值,文本都不会有变化,从后台更改选中项,请选择SelectedItem

    网上看到很多说IsSynchronizedWithCurrentItem属性可以用于设置默认第一项,实际显示效果确实会第一项,但是绑定的SelectedItem和SelectedValue并不会自动赋值,仅仅只是更改了文本值

    总结

    以上皆是个人心得,如果错误,还请指正,谢谢

  • 相关阅读:
    关于java.lang.OutOfMemoryError: Java heap space的错误分析
    对TCP/IP网络协议的深入浅出归纳
    leetcode面试准备:Contains Duplicate I && II
    leetcode面试准备:Count Complete Tree Nodes
    leetcode面试准备: Jump Game II
    leetcode面试准备: Jump Game
    LeetCode解题报告:Linked List Cycle && Linked List Cycle II
    最小栈的实现与优化
    面试:归并排序
    leetcode面试准备:Decode Ways
  • 原文地址:https://www.cnblogs.com/ma-nong01/p/14323407.html
Copyright © 2011-2022 走看看