2010-02-16 66 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