DisplayMemberPath与SelectedValuePath

DisplayMemberPath和SelectedValuePath分别在ItemsControl和Selector类中使用,用于显示和获取对象属性值。当对象为复合类型时,DisplayMemberPath设置显示哪个属性,如在ComboBox中展示Product的Name属性。而SelectedValuePath指定SelectedValue的值为哪个成员,如选择Product的Age属性。在ComboBox示例中,当选中项改变时,SelectionChanged事件会触发,显示选中Product的ID属性值。

DisplayMemberPath和SelectedValuePath是两个属性成员,但它们并不是来自同一个类。DispalyMemberPath属性由ItemsControl类公开,而SelectedValuePath是Selector类的属性。当向ItemsControl控件添加的对象如果不是可视化对象时,会调用该对象的ToString()方法来获得该对象的字符串表示形式,然后在ItemsControl控件中使用TextBlock控件来呈现。

这就引出一个新的问题:如果对象的类型是复合类型,或者开发者自定义的类型,调用ToString方法通常返回的是对象的类型名称,而不是类实例的成员信息,这显然没有实际意义。

为了解决上述问题,ItemsControl类公开一个DisplayMemberPath属性,用来设置在ItemsControl控件中显示对象的哪个属性的值。例如,一个表示学员信息的Student类,它的Name属性表示学员姓名,Age属性表示学员的年龄。若是直接把Student实例添加到ItemsControl控件的项集合中,那么ItemsControl中只显示Student的类型名(包括命名空间的名称,如Demo.Student),而不会显示Student实例上各个属性的值。这时候如果设置DisplayMemberPath属性为Name,那么ItemsControl控件中就会显示Student实例额Name属性的值。

从Selector派生的控件允许用户对列表中的项进行选择,SelectedIndex属性表示被选中的项在集合中的索引(索引值从0开始),SelectedItem属性表示被选中的项。SelectedValuePath属性用于指定用源对象中的哪个成员的值来设置SelectedValue属性的值。例如上面举例的Student类,如果SelectedValuePath属性设置为Age,那么SelectedValue属性的值就是当前被选中项的Age属性的值。

派生自Selector类的类型有ListBox、ComboBox等,接下来将以ComboBox控件为例,演示一下DisplayMemberPath属性和SelectedValuePath属性的用法。

ComboBox控件即下拉列表框,当控件被单击时,会弹出一个列表框,用户可以在其中做出选择,当选择框关闭后,ComboBox控件中将显示当前选中的项。

首先定义一个表示产品信息的Product类。

    class Product
    {
        /// <summary>
        /// 产品编号
        /// </summary>
        public string ID { get; set; }
        ///<summary>
        ///产品名称
        ///</summary>
        public string Name { get; set; }
    }    class Product
    {
        /// <summary>
        /// 产品编号
        /// </summary>
        public string ID { get; set; }
        ///<summary>
        ///产品名称
        ///</summary>
        public string Name { get; set; }
    }

应用程序页面相关的XAML代码如下:

    <StackPanel>
        <ComboBox x:Name="cmd" Margin="8,5" DisplayMemberPath="Name" SelectedValuePath="ID" SelectionChanged="cmd_SelectionChanged"/>
        <TextBlock Margin="5" FontSize="20" TextWrapping="Wrap">
            SelectedValue的值:<Run x:Name="runID"/>
            <LineBreak/>
            selectedItem的类型:<Run x:Name="runType"/>
        </TextBlock>
    </StackPanel>

DisplayMemberPath属性设置为Name表明ComboBox的列表项将向用户呈现Product类的Name属性的值,SelectedValuePath的值将指定SelectedValue属性所返回的值为当前被选中的Product实例的ID属性的值。当ComboBox控件中被选中的项发生改变时会引发SelectionChanged事件,因此处理该事件,并获取当前被选中项的信息。

        private void cmd_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            object val = (sender as ComboBox).SelectedValue;
            runID.Text = val == null ? "无" : val.ToString();
            object selitem = (sender as ComboBox).SelectedItem;
            runType.Text = selitem == null ?"未知":selitem.GetType().Name;
        }

在页面类的构造方法中为ComboBox控件指定数据源:

        public MainPage()
        {
            this.InitializeComponent();
            cmd.ItemsSource = new Product[]
            {
                new Product{ID = "T-001",Name = "试验产品 1"},
                new Product{ID = "T-002",Name = "试验产品 2"},
                new Product{ID = "T-003",Name = "试验产品 3"},
                new Product{ID = "T-004",Name = "试验产品 4"}
            };
        }

运行应用程序,然后单击页面顶部的ComboBox控件,打开下拉选择框,此时,可以看到项集合中显示的是每个Product实例的Name属性的值。

在下拉列表框中选择一个项后,会看到ComboBox下方的TextBlock控件显示相关的信息,SelectedValue属性返回的就是被选中的Product实例的ID属性的值。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值