DisplayMemberPath 与 DataTemplate - WPF data binding 1

本文介绍了在WPF中如何使用DisplayMemberPath和DataTemplate来绑定Collections数据结构。通过一个股票数据的例子,展示了如何展示StockData类中的价格和时间信息。DisplayMemberPath用于显示单一属性,如价格;而DataTemplate则允许更复杂的布局,可以同时显示多个属性,如价格和时间。

(原创,转载请注明出处 http://blog.youkuaiyun.com/zhaohuiy)

 

在WPF databinding 中,如果我们要将一个ItemsControl类型的UI 绑定到一个Collections数据结构的某一维上,那么至少有DisplayMemberPath 与 DataTemplate 两种方法可供使用,下面用一个例子说明这个技术:

 

比如对一只股票Stock, 采集其数据,可能会有 “时间、价、量”等三个维度,我们可能会定义出一个:

 

Class StackData

{

    DateTime stockTime {get; set;}

    Double stockPrice {get; set;}

    Double stockVolume {get; set;}

   ...

}

 

经过一段时间采集,数据存储到了 List<StockData> myData 中。

 

然后在我们的某个UI界面上,需要列表显示这组采集的数据中的所有价格 price 的信息,那我们可以:

 

(I)

 

<Listbox x:Name ="lbStock" ItemsSource="{Binding Path=MyData}" DisplayMebmberPath="stockPrice".../>

 

这个 DisplayMebmberPath 就是将复合数据中的某一个维度抽出来绑定的机制。

 

(II)

 

当然,还有一种更普遍适用的方式,使用DataTemplate,比如说在同

<think> 嗯,用户询问的是WPF ComboBox控件的DisplayMemberPath属性,这个在数据绑定中确实很关键。用户明确提到了需要了解它的使用方法作用,看来是在做WPF开发时遇到了具体需求。 从引用内容看,DisplayMemberPath主要解决的是数据对象显示的简洁性问题。引用[2]中那个ListBox的例子特别直观——当绑定了StudentList集合时,只需设置DisplayMemberPath="Name",就能让ListBox直接显示学生姓名而非整个对象的ToString()结果。这比传统的数据模板简洁多了。 注意到用户引用的第三个例子是ComboBox的,当前问题完全匹配:那个ComboBox同时使用了DisplayMemberPath="Name"SelectedValuePath="Id",这种组合在开发中太常见了。用户可能正在处理类似的下拉框需求,比如需要显示名称但实际存储ID值。 用户应该需要知道几个要点:第一,DisplayMemberPath本质是替代ItemTemplate的快捷方式;第二,它SelectedValuePath经常配合使用;第三,它只影响显示不影响实际绑定值。那个成绩显示的错误例子很有必要说明,因为初学者常在这里踩坑。 考虑到用户可能刚接触WPF,相关问题的设计要偏向基础:数据模板对比能帮助理解本质,SelectedValue的关联问题则是实际开发高频痛点。另外用户没问但值得延伸的是MVVM模式下的应用,毕竟这些属性在MVVM里几乎必用。 最后要注意术语一致性,保持说“属性”而非“字段”,所有控件名称首字母大写,就像官方文档那样。示例代码保持XAML小写风格,但控件类名首字母突出显示。 </think> 在 WPF 中,`ComboBox` 的 `DisplayMemberPath` 属性用于**简化数据绑定对象的显示方式**,它能直接指定集合中对象的某个属性作为显示内容。以下是详细说明用法示例: --- ### **一、核心作用** 1. **显示优化** 当 `ComboBox` 绑定对象集合(如 `List<Student>`)时,若不设置 `DisplayMemberPath`,默认会显示对象的 `ToString()` 结果(通常为类名)。启用该属性后,直接显示指定属性的值(如学生姓名)。 2. **替代复杂模板** 无需编写完整 `DataTemplate` 即可实现自定义显示,简化 XAML 代码。 --- ### **二、使用方法** #### 语法格式 ```xaml <ComboBox ItemsSource="{Binding 对象集合}" DisplayMemberPath="集合中的属性名" SelectedItem="{Binding 选中项}" /> ``` #### 示例场景 假设有 `Student` 类: ```csharp public class Student { public int Id { get; set; } public string Name { get; set; } public int Score { get; set; } } ``` **XAML 绑定代码**: ```xaml <ComboBox ItemsSource="{Binding StudentList}" DisplayMemberPath="Name" <!-- 指定显示 Name 属性 --> SelectedItem="{Binding SelectedStudent}" /> ``` - ✅ **效果**:下拉列表显示所有学生的 `Name`(如 "张三"、"李四"),而非默认的 `Student` 类名。 - ❌ **未设置时**:显示 `YourNamespace.Student`(无意义字符串)。 --- ### **三、对比 `SelectedValuePath`** 常 `DisplayMemberPath` 配合使用: | **属性** | **作用** | **示例** | |---------------------|----------------------------------|-------------------------| | `DisplayMemberPath` | 控制显示内容 | `DisplayMemberPath="Name"` → 显示姓名 | | `SelectedValuePath` | 指定选中项后返回的值对应的属性 | `SelectedValuePath="Id"` → 选中后返回 `Id` | | `SelectedValue` | 绑定选中项的值(由 `SelectedValuePath` 指定) | `SelectedValue="{Binding ChosenId}"` | **组合使用示例**: ```xaml <ComboBox ItemsSource="{Binding StudentList}" DisplayMemberPath="Name" SelectedValuePath="Id" SelectedValue="{Binding SelectedStudentId}" /> ``` - 用户看到姓名列表(`Name`) - 选中后,后台 `SelectedStudentId` 自动更新为对应学生的 `Id` --- ### **四、常见问题** 1. **显示错误内容** ```xaml <!-- 错误:试图显示未绑定的属性 --> <TextBlock Text="{Binding SelectedItem}" /> ``` ✅ **正确做法**: ```xaml <TextBlock Text="{Binding SelectedItem.Name}" /> ``` 2. ** `ItemTemplate` 冲突** 若同时设置 `DisplayMemberPath` `ItemTemplate`,**`ItemTemplate` 会覆盖前者**。 --- ### **五、适用场景** - 简单文本显示(无需复杂样式) - 快速绑定对象属性(避免编写模板) - 需要分离显示值实际值(如显示名称但存储ID) ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值