2

我是 DataBindings 的新手。我正在尝试将文件列表(更准确地说是 a IEnumerable<FileInfo>)绑定到ListViewC#(Visual Studio 2010)中的 a 。这是我想要做的(我做了很多试验,这是最简单的发布):

我的 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>

我的“项目”课程是这样的。我知道我没有触发 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两者都设置为局部变量和实例成员,但无论哪种方式都不起作用。

效果是根本没有更新任何项目,列表继续为空。

有什么建议吗?我对此很陌生,所以不排除愚蠢的错误。

提前致谢

4

3 回答 3

3

一个快速的解决方案,可以更好(使用视图模型)......

你必须让你的 ObservableCollection 成为一个属性:

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

如果Loaded您的用户控件初始化您的集合:

this.MyInvoices = ....

在同一事件中,将用户控件的 DataContext 设置为自身:

this.DataContext = this;

现在在 XAML 中执行:

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

这样,当您向用户控件添加更多内容时,只需添加属性并准备好绑定。

于 2012-04-12T14:07:22.633 回答
2

您希望将 ObservableCollection 分配给 ListView 的 ItemsSource 属性,而不是分配给 DataContext。

于 2012-04-12T13:57:30.867 回答
1

尝试将 ListView 上的 ItemsSource 设置为 {Binding} 以便它知道从其 DataContext 中获取其项目: ItemsSource="{Binding}"

于 2012-04-12T14:03:02.433 回答