listbox数据绑定问题
背景是这样,一个listbox绑定一个泛型集合,代码中我设置listbox的ItemsSource属性为此集合,现在我想在listbox中显示集合项的序号,比如集合有5项,就显示1 2 3 4 5,并且操作(删除或添加)序号能够自动更新序号,同时保证listbox的SelectedItem就是集合里的实际对象.
我现在试了用list集合和SortedList集合,都不能同时满足,希望大神解决!
用list类,能够保证listbox的SelectedItem就是集合里的实际对象,可是UI上listbox显示是集合对象名称.用SortedList集合,listbox的ItemsSource属性为SortedList集合的Keys,Keys我设置为1 2 3 4 5这样,显示可以解决,但是不能保证listbox的SelectedItem就是集合里的实际对象,还有就是我还要另外的逻辑代码处理序号更新以及集合对象的删除添加,感觉很啰嗦.
请大神帮我看看,怎么搞比较方便!
c#代码:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace DataTest
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
//SortedList<int, Person> list = new SortedList<int, Person>() { { 1, new Person() { ID = "q", Name = "ann", Age = 30 } } };
List<Person> list = new List<Person>() { new Person() {ID="q",Name="ann",Age=30 } };
public MainWindow()
{
InitializeComponent();
listBox.ItemsSource = list;
//listBox.DisplayMemberPath = ;
groupBox.SetBinding(DataContextProperty,new Binding("SelectedItem") {Source= listBox, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
textBox1.SetBinding(TextBox.TextProperty, new Binding("ID") { Mode=BindingMode.TwoWay,UpdateSourceTrigger=UpdateSourceTrigger.PropertyChanged});
textBox2.SetBinding(TextBox.TextProperty, new Binding("Name") { Mode = BindingMode.TwoWay, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
textBox3.SetBinding(TextBox.TextProperty, new Binding("Age") { Mode = BindingMode.TwoWay, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
}
private void button_Click(object sender, RoutedEventArgs e)
{
//list.Add(list.Keys.Count+1,new Person());
listBox.Items.Refresh();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
//list.RemoveAt(listBox.SelectedIndex);
listBox.Items.Refresh();
}
}
}
xaml代码:(随便弄的,只是测试)
<Window x:Class="DataTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:DataTest"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid Name="grid">
<GroupBox x:Name="groupBox" Header="数据" HorizontalAlignment="Left" Margin="185,29,0,0" VerticalAlignment="Top" Height="255" Width="269">
<Grid >
<TextBox x:Name="textBox1" HorizontalAlignment="Left" Height="23" Margin="75,32,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
<TextBox x:Name="textBox2" HorizontalAlignment="Left" Height="23" Margin="75,73,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
<TextBox x:Name="textBox3" HorizontalAlignment="Left" Height="23" Margin="75,115,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
</Grid>
</GroupBox>
<ListBox x:Name="listBox" HorizontalAlignment="Left" Height="212" Margin="10,29,0,0" VerticalAlignment="Top" Width="159" SelectedIndex="0">
</ListBox>
<Button x:Name="button" Content="add" HorizontalAlignment="Left" Margin="10,270,0,0" VerticalAlignment="Top" Width="75" Click="button_Click"/>
<Button x:Name="button1" Content="delet" HorizontalAlignment="Left" Margin="94,270,0,0" VerticalAlignment="Top" Width="75" Click="button1_Click"/>
</Grid>
</Window>
数据类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DataTest
{
class Person
{
private string _ID = "a";
private string _Name = "hh";
private int _Age=20;
public string ID
{
get
{
return _ID;
}
set
{
_ID = value;
}
}
public string Name
{
get
{
return _Name;
}
set
{
_Name = value;
}
}
public int Age
{
get
{
return _Age;
}
set
{
_Age = value;
}
}
}
}