2012-04-12 172 views
2

我是DataBindings的新手。我試圖將文件列表(更合適的,IEnumerable<FileInfo>)綁定到C#(Visual Studio 2010)中的ListView。這裏就是我想要做(我已經做了很多試驗,這是最簡單的發佈):將數據綁定到ListView

我的XAML是(沒有資源/數據綁定在別處定義):

 <ListView 
      Name="lvInvoices" Height="Auto" HorizontalAlignment="Center" VerticalAlignment="Stretch" 
      Width="Auto" MinWidth="150" MinHeight="100" Margin="10"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Header="#" Width="Auto"/> 
        <GridViewColumn Header="Fichero" Width="Auto" DisplayMemberBinding="{Binding Path=SourceFile}"/> 
        <GridViewColumn Header="Importe" Width="Auto"/> 
       </GridView> 
      </ListView.View> 
     </ListView> 

我'item'類是這個。我知道我不發射PropertyChanged事件,現在我只想填充列表。

using System; 
using System.IO; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace SPInvoiceLoader 
{ 
    public class Invoice : System.ComponentModel.INotifyPropertyChanged 
    { 
    public Invoice() 
    { 
    } 

    public Invoice(FileInfo srcFile) 
    { 
     this.SourceFile = srcFile; 
    } 
    public FileInfo SourceFile { get; private set; } 
    public int SpId { get; set; } 
    public Decimal Amount { get; set; } 
    public string Nif { get; set; } 
    public bool Signed { get; set; } 

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 
    } 
} 

而且在DataContext設置的代碼是:

IEnumerable<FileInfo> pdfFiles = dir.EnumerateFiles("*.pdf"); 
    pdfFiles = pdfFiles.OrderBy(f => f.Name); 
    ObservableCollection<Invoice> coll = new ObservableCollection<Invoice>(); 
    foreach (FileInfo pdfFile in pdfFiles) 
    { 
     coll.Add(new Invoice(pdfFile)); 
    } 
    this.lvInvoices.DataContext = coll; 

我已經嘗試設置pdfFiles既作爲一個局部變量和一個實例成員,但它不工作,無論哪種方式。

效果是根本沒有項目被更新,列表仍然是空的。

有什麼建議嗎?我很新,所以不要排除愚蠢的錯誤。

在此先感謝

+1

嘗試將ListView上的ItemsSource設置爲{Binding},以便知道從其DataContext中獲取其項目,如下所示:ItemsSource =「{Binding}」 – tomasmcguinness 2012-04-12 13:54:05

+0

@tomasmcguinness您是對的,謝謝。把這個作爲答案,我可以接受它 – SJuan76 2012-04-12 13:58:36

回答

1

嘗試在ListView控件設置的ItemsSource到{結合}所以它知道從它的DataContext拿起它的項目,以便:的ItemsSource =「{結合}」

2

你想你的ObservableCollection分配到ListView沒有到DataContext的ItemsSource屬性。

+0

這也工作了,謝謝。 – SJuan76 2012-04-12 14:00:58

3

一個快速的解決方案,可以更好的(使用視圖模型)...

你必須讓你的ObservableCollection屬性:

public ObservableCollection<Invoice> MyInvoices { get; set; } 

Loaded事件用戶控件的初始化您的收藏:

this.MyInvoices = .... 

在同一事件中設置用戶控件的DataContext的本身:

this.DataContext = this; 
在XAML

現在做:

<ListView ItemsSource="{Binding MyInvoices}"></ListView> 

這樣一來,當您將添加更多的東西到你的用戶控制只是添加屬性,你已經準備好了綁定。

+0

它的工作太...實際上我喜歡這個選項,因爲它比其他兩個更通用(他們也提供了正確的答案)。 – SJuan76 2012-04-13 14:26:35