【WPF绑定1】 ListBox/ComboBox基础绑定

ListBox的基础绑定

下面是ListBox的基础绑定设置:

<ListBox Name="list_axis" DisplayMemberPath="Name" SelectedValuePath="Num" SelectionChanged="list_axis_SelectionChanged"/>

DisplayMemberPath属性:显示的值

SelectedValuePath属性:在选中某个Item时我们可以通过ListBox的SelectedValue属性获取的值的类型

我们先构建一个list数据结构,包含DisplayMemberPath和SelectedValuePath指定的属性:Name和Num

//单个item的数据结构
public class Axis
{
    /// <summary>
    /// 软轴号
    /// </summary>
    public int Num { get; set; }

    /// <summary>
    /// 轴名称
    /// </summary>
    public string Name { get; set; }
}



//整个数据源
static public List<Axis> axisList = new List<Axis>()
{
    new Axis(){Num=0,Name="吸嘴X轴"},
    new Axis(){Num=1,Name="吸嘴Y轴"},
    new Axis(){Num=2,Name="吸嘴Z轴"},
    new Axis(){Num=3,Name="托盘轴"},
    new Axis(){Num=4,Name="切膜Z轴"},
    new Axis(){Num=5,Name="贴膜台Z轴"},
    new Axis(){Num=6,Name="上料Z轴"},
    new Axis(){Num=7,Name="推PCB轴"},
    new Axis(){Num=8,Name="托膜轴"},
    new Axis(){Num=9,Name="压膜轴"},
    new Axis(){Num=10,Name="切膜旋转轴"},
}; 

后台代码

public PageMotorTest()
{
    InitializeComponent();
    //用于绑定源数据
    this.list_axis.ItemsSource = App.axisList;
}


private void list_axis_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (list_axis.SelectedItem != null)
    {
        //注意SelectedValue的值!
        MessageBox.Show(list_axis.SelectedValue.ToString());
    }
}
        


执行效果:


SelectedValuePath 和 SelectedValue 的关系

在上述ListBox的Binding中,我们指定了ItemsSource 是一个数组,那么ListBox每个子项其实就是数组的一个元素,如果不设置SelectedValuePath ,SelectedValue就对应的选择的那个元素,而这个元素有多个属性,SelectedValuePath 像是一个过滤器帮你选择这个元素的哪个属性,一旦设置了SelectedValuePath,那么SelectedValue对应的就是元素的那个属性。

这里我们再用ComboBox做一个实验:

注意这里我并没有指定ItemsSource,而是将子项直接写道前台里面,那此时ComboBox每个子项其实就是ComboBoxItem。

<ComboBox SelectedValuePath="Content" 
    SelectedValue="{Binding ConfigVM.config_infos.SpectrumType}"
              >
    <ComboBoxItem>BSHP</ComboBoxItem>
    <ComboBoxItem>Flame</ComboBoxItem>
</ComboBox>

如果你没有设置SelectedValuePath,那么SelectedValue对应的会是ComboBoxItem这个类对象,转换成字符串就是'System.Windows.Controls.ComboBoxItem: Flame'  如果你只想要其中的内容Flame,此时就需要设置SelectedValuePath="Content",此时SelectedValue才会对应Flame/BSHP。

SelectedValue 和 Text 的区别

这里,有的同学可能会提出问题:我直接绑定Text属性不就行了?Text属性这里有两个问题:

1 对应ComboBox而言,IsEditable="True"时 Text才能显示内容。(而有的时候我们不希望编辑)

2 SelectionChanged事件触发后,此时只会改变SelectedValue的值,而此时Text的值还是之前的值,这不利于我们更新数据到数据源。

posted @ 2021-11-03 13:23  宋桓公  阅读(97)  评论(0编辑  收藏  举报