C#技术问题:如何在ListBox中按名称显示对象并完整存储
解决ListBox存完整对象同时显示指定属性的问题
方案1:重写Employee类的ToString方法
直接在Employee类里重写ToString方法,返回Name属性。这样把Employee对象添加到ListBox时,列表会自动用ToString的返回值作为显示内容,而项本身依然是完整的Employee对象,双击事件可以正常获取对象。
修改后的Employee类代码:
class Employee { public string Name; public string Position; public DateTime BirthDate; public DateTime StartDate; public decimal Wage; public Employee(string name, string position, DateTime birthDate, DateTime startDate, decimal wage) { Name = name; Position = position; BirthDate = birthDate; StartDate = startDate; Wage = wage; } // 重写ToString,返回Name作为显示文本 public override string ToString() { return Name; } }
按钮点击事件可以简化(无需临时List):
private void btnAdd_Click(object sender, RoutedEventArgs e) { var name = txtName.Text; var position = txtPosition.Text; DateTime birthDate = dpBirthDate.Date.DateTime; DateTime startDate = dpStartDate.Date.DateTime; var wageValue = txtWage.Text; decimal wage = Decimal.Parse(wageValue); // 直接创建对象并添加到ListBox lbEmployee.Items.Add(new Employee(name, position, birthDate, startDate, wage)); }
方案2:设置ListBox的DisplayMemberPath属性
无需修改Employee类,直接在XAML中给ListBox指定DisplayMemberPath为"Name",列表会自动绑定显示每个项的Name属性,项本身依然是完整的Employee对象。
XAML示例:
<ListBox x:Name="lbEmployee" DisplayMemberPath="Name" DoubleTapped="lbEmployee_DoubleTapped" />
后台代码保持原添加对象的逻辑即可,双击事件不受影响。
方案3:使用数据模板(适配复杂显示需求)
如果后续需要显示多个属性(比如同时展示Name和Position),可以用数据模板自定义列表项的显示样式,同样不影响项的对象类型。
XAML示例:
<ListBox x:Name="lbEmployee" DoubleTapped="lbEmployee_DoubleTapped"> <ListBox.ItemTemplate> <DataTemplate> <!-- 自定义显示内容,这里仅展示Name,可扩展添加其他属性 --> <TextBlock Text="{Binding Name}" /> </DataTemplate> </ListBox.ItemTemplate> </ListBox>
后台代码直接添加Employee对象即可,双击事件正常工作。
内容的提问来源于stack exchange,提问作者BAPTZ
相关产品推荐
相关产品推荐

