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的值还是之前的值,这不利于我们更新数据到数据源。