listbox数据绑定问题

henhenhayi 2016-10-26 04:19:19
背景是这样,一个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;
}
}
}
}
...全文
320 4 打赏 收藏 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
我叫小菜菜 2016-10-26
  • 打赏
  • 举报
回复
你需要刷新listbox的IView。因为前后台数据绑定,需要有变化通知。
Forty2 2016-10-26
  • 打赏
  • 举报
回复
一个取巧的方法是绑定到ItemsControl.AlternationIndex属性上。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="用回车键改变次序" Height="350" Width="525">
    <ListBox ItemsSource="{Binding}" TextBlock.FontSize="24" AlternationCount="10000">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Width="100" Text="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=(ItemsControl.AlternationIndex)}"/>
                    <TextBlock Width="150" Text="{Binding Id}" FontWeight="Bold"/>
                    <TextBlock Width="200" Text="{Binding Name}" FontWeight="Bold"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Window>

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            var ps = new ObservableCollection<Person>()
                {
                    new Person() { Id = "dbod", Name = "Bob Dylan"},
                    new Person() { Id = "spaul", Name = "Paul Simon"},
                    new Person() { Id = "yneil", Name = "Neil Young"},
                };
            this.DataContext = ps;
            this.KeyDown += (sender, e) => ps.Move(0, ps.Count - 1);
        }
    }
    class Person
    {
        public string Id { get; set; }
        public string Name { get; set; }
    }
}
henhenhayi 2016-10-26
  • 打赏
  • 举报
回复
大神指导下啊,能不能从1开始显示啊,我都干了三天了,这个问题一直没有解决啊
henhenhayi 2016-10-26
  • 打赏
  • 举报
回复
试了下,倒是有点靠谱,删除增加都不需要操心了,只是能从1开始么?

111,128

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧