将项绑定到ListBox多列

时间:2012-06-18 16:38:09

标签: c# wpf xaml listbox multiple-columns

我正在尝试将我的数据添加到多个列ListBox中,我做到了但是在尝试从列表框中检索数据时遇到了一个难题。有没有办法将对象而不是文本放入listBox行?

<ListView Name="listBox1" ItemsSource="{Binding Items}" Margin="28,28,68,67" FlowDirection="RightToLeft" MouseDoubleClick="listBox1_MouseDoubleClick">
        <ListView Name="listBox1" ItemsSource="{Binding Items}" Margin="28,28,68,67" FlowDirection="RightToLeft" MouseDoubleClick="listBox1_MouseDoubleClick">
        <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn Header="a" Width="100" DisplayMemberBinding="{Binding Path=ID}" />
                    <GridViewColumn Header="b" Width="100" DisplayMemberBinding="{Binding Path=Name}" />
                    <GridViewColumn Header="c" Width="100" DisplayMemberBinding="{Binding Path=F}" />
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

这是代码

 public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    public sealed class MyListBoxItem
    {
        public string Field1 { get; set; }
        public string Field2 { get; set; }
        public string Field3 { get; set; }
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        Students st = new Students(1, "name","anything");
        listBox1.ItemsSource = new List(new[] { st });
    }

    private void listBox1_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        object ob = listBox1.SelectedItem;
        string i = ((MyListBoxItem)listBox1.SelectedItem).Field1;
    }
}

这是班级学生

 class Students
{
    int id;
    string name;
    string f;

    public Students(int id, string name,string f)
    {
        this.id = id;
        this.name = name;
        this.f = f;
    }
    public int ID
    {
        get { return id; }
        set { id = value; }
    }
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
    public string F
    {
        get { return f; }
        set { f = value; }
    }
}

1 个答案:

答案 0 :(得分:5)

不要使用listBox1.Items.Add(....)。而是使用listBox1.ItemsSource = new List(new [] {st});

然后将您的DisplayMemberBindings分别更改为“Id”,“Name”。

不需要ListBoxItem类。

==编辑==

你非常接近完美。我已经在下面附上它应该如何工作。需要注意的重要事项是ListView for ItemsSource和SelctedITem中的Bindings,并将IsSynchronisedWithCurrentItem设置为true。

此外,在网格的底部两行中,我展示了两种不同的绑定方式,一种使用“/”符号,另一种使用ViewModel上的属性

XAML

<Window x:Class="StackOverflow11087468.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
            <ListView Name="listBox1"
                      Grid.Row="0"
                      ItemsSource="{Binding Students}"
                      SelectedItem="{Binding SelectedStudent}"
                      IsSynchronizedWithCurrentItem="True"
                      Margin="28,28,68,67"
                      FlowDirection="RightToLeft">
                <ListView.View>
                    <GridView>
                        <GridView.Columns>
                            <GridViewColumn Header="a"
                                            Width="100"
                                            DisplayMemberBinding="{Binding Path=ID}" />
                            <GridViewColumn Header="b"
                                            Width="100"
                                            DisplayMemberBinding="{Binding Path=Name}" />
                            <GridViewColumn Header="c"
                                            Width="100"
                                            DisplayMemberBinding="{Binding Path=F}" />
                        </GridView.Columns>
                    </GridView>
                </ListView.View>
            </ListView>

        <StackPanel Grid.Row="1" Orientation="Horizontal">
            <TextBlock>ID</TextBlock>
            <TextBox Text="{Binding Students/ID}" />            
        </StackPanel>

        <StackPanel Grid.Row="2"
                    Orientation="Horizontal">
            <TextBlock>ID</TextBlock>
            <TextBox Text="{Binding SelectedStudent.ID}" />
        </StackPanel>
    </Grid>
</Window>

Main.Window.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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 StackOverflow11087468
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.DataContext = new ViewModel();
        }
    }
}

ViewModel.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using System.ComponentModel;

namespace StackOverflow11087468
{
    public class ViewModel : INotifyPropertyChanged
    {
        public ObservableCollection<Student> Students { get; set; }

        public ViewModel()
        {
            this.Students = new ObservableCollection<Student>();
            Students.Add(new Student(98760987, "Student1", "F"));
            Students.Add(new Student(98760988, "Student22", "M"));
        }

        public Student SelectedStudent
        {
            get { return _selectedStudent; }
            set
            {
                _selectedStudent = value;
                RaisePropertyChanged("SelectedStudent");
            }
        }

        private void RaisePropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private Student _selectedStudent;
    }
}