2010-02-16 25 views
2

解决解决SLOVEDWPF数据绑定到泛型列表<>

仿制药清单结构列表

如果你使用的,而不是一个结构的一类,它工作正常

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


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

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

我试过玩弄ItemsSource,DataContext,DisplayMemberPath和SelectedValuePath,我要么在Person对象中调用ToString方法列表的空白列表;

什么是真正的帮助是有人发布一个适用于这个例子的答案。

我已经简化了这个问题,因为我在使用数据绑定泛型时遇到了一些困难。

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

我要么得到毛坯列表或“xxxx.Person”的名单,其中xxxx =显示命名空间

 <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; 
    } 
} 
+0

我试过你的示例,它适用于我。除了多次显示dddd。 – 2010-02-16 04:47:21

回答

5

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

更改您的个人声明:

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

(对于生产代码,你可能会想使用一个ObservableCollection<Person>而非List<Person>,要么使个人不可改变或使其执行INotifyPropertyChanged - 但那些AREN您的直接问题的来源。)

0

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

如果你可以发布一些你看到的问题的实际代码,这将有助于缩小它,因为你在这里放置的代码甚至不可编译。

+0

我已经在这里把完整的代码在这里 – Adam 2010-02-16 05:03:26

+0

请参阅修改后的问题..任何帮助感激地收到。 – Adam 2010-02-16 05:13:49

0

嗯......我假设你的实际代码已经修正了语法,因为你粘贴的代码不会编译。

我把这段代码放到一个新的WPF应用程序中,并且在新建每个Person对象后,我的组合框填充正常。您可能想要将您的人口代码移到Loaded事件中,这将确保表格构造正确。这里的修正XAML和代码隐藏(有一些语法快捷方式):

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; 
    } 
+0

是的..在我的部分是一个错误..虽然学习如何在这里粘贴代码..仍然只是调用人的ToString()而不是列出项目 – Adam 2010-02-16 04:57:15

+0

你是否按照上面的itowlson的建议,并将你的结构改为类和字段属性? 虽然在您的情况下没有必要拥有类,但如果您想要双向绑定,则必须使用类,所以最好总是使用类。 – 2010-02-17 02:09:21