WPF数据绑定到通用列表<>

时间:2010-02-16 04:15:36

标签: wpf wpf-controls binding

我做错了什么......你知道它是怎么回事。

我尝试过使用ItemsSource,DataContext,DisplayMemberPath和SelectedValuePath,我得到一个空白列表,列出了在Person对象中调用的ToString方法;

真正有用的是有人发布适用于此示例的答案。

我已经简化了问题,因为我在数据绑定泛型方面遇到了一些困难。

我创建了一个简单的Person通用列表,并希望将其绑定到组合。 (也想尝试使用ListView)。

我得到一个空白列表或'xxxx.Person'列表,其中xxxx = namespace

       <Window x:Class="BindingGenerics.MainWindow"
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                Title="MainWindow" Height="300" Width="300">
            <Grid>

                <ComboBox Name="ComboBox1"
                          ItemsSource="{Binding}"
                          Height="50"
                          DisplayMemberPath="Name"
                          SelectedValuePath="ID"
                          FontSize="14"
                          VerticalAlignment="Top">
                </ComboBox>

            </Grid>
        </Window>



using System.Windows;
using System.ComponentModel;

namespace BindingGenerics
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            Person p = new Person();
            // I have tried List and BindingList
            //List<Person> list = new List<Person>();
            BindingList<Person> list = new BindingList<Person>();

            p.Name = "aaaa";
            p.ID = "1111";
            list.Add(p);

            p = new Person();
            p.Name = "bbbb";
            p.ID = "2222";
            list.Add(p);

            p = new Person();
            p.Name = "cccc";
            p.ID = "3333";
            list.Add(p);

            p = new Person();
            p.Name = "dddd";
            p.ID = "4444";
            list.Add(p);

            ComboBox1.DataContext = list;
        }
    }

    public struct Person
    {
        public string Name;
        public string ID;
    }
}

3 个答案:

答案 0 :(得分:5)

在您的代码示例中,Person.Name是一个字段而不是一个属性。 WPF数据绑定仅考虑属性,而不考虑字段,因此您需要将Person.Name更改为属性。

将您的人员声明更改为:

public class Person
{
  public string Name { get; set; }
  public string ID { get; set; }
}

(对于生产代码,您可能希望使用ObservableCollection<Person>而不是List<Person>,并使Person不可变或使其实现INotifyPropertyChanged - 但这些不是您的来源眼前的问题。)

答案 1 :(得分:0)

在显示的代码中,你将两次设置ItemsSource,第一次在XAML中(由InitializeComponent调用)到ComboBox1的DataContext,这不能从你发布的内容中确定,但它可能不是你想要的。之后,您将其从代码重置为列表对象(此处使用拼写错误)。在此代码中,您还要添加相同的Person实例4次,并且只是一遍又一遍地更改其名称和ID。我怀疑这些问题的组合以及您使用List而不是ObservableCollection导致应用程序出现问题。

如果您可以发布一些您遇到问题的实际代码,这将有助于缩小范围,因为您在此处放置的内容甚至无法编译。

答案 2 :(得分:0)

嗯......我假设您的实际代码已经更正了语法,因为您粘贴的代码将无法编译。

我把这段代码放到一个新的WPF应用程序中,在新建每个Person对象后,我的组合框填充得很好。您可能希望将填充代码移动到Loaded事件中,这将确保正确构造表单。这是更正后的xaml和codebehind(带有一些语法快捷方式):

XAML:

<Grid>
    <ComboBox Name="ComboBox1" Height="70"  
        DisplayMemberPath="Name"    
        SelectedValuePath="ID" />
</Grid>

代码隐藏:

    public Window1()
    {
        InitializeComponent();
        this.Loaded += new RoutedEventHandler(Window1_Loaded);
    }

    void Window1_Loaded(object sender, RoutedEventArgs e)
    {
        var list = new List<Person>();
        Person p = new Person(){Name = "aaaa",ID = "1111"};
        list.Add(p);
        p = new Person(){Name = "bbbb", ID="2222"};
        list.Add(p);
        p = new Person(){Name = "cccc", ID="3333"};
        list.Add(p);
        p = new Person(){Name = "dddd", ID="4444"};
        list.Add(p);
        ComboBox1.ItemsSource = list;
    }