2

DataBindingsは初めてです。ファイルのリスト(より正確には、IEnumerable<FileInfo>)をListViewC#(Visual Studio 2010)のにバインドしようとしています。これが私がやろうとしていることです(私はもっとたくさんの試行をしました、これは投稿するのが最も簡単です):

私の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をDataContextではなくListViewのItemsSourceプロパティに割り当てたいとします。

于 2012-04-12T13:57:30.867 に答える
1

ListViewのItemsSourceを{Binding}に設定して、DataContextからアイテムを取得できるようにします。ItemsSource= "{Binding}"

于 2012-04-12T14:03:02.433 に答える