0

次の単純なデータ構造があります。

私が持っているモデルでは

    public class Receipt
    {
    public int Id { get; set; }
    public double Price { get; set; }
    public string Store { get; set; }
    public DateTime Date { get; set; }
    }

これらのオブジェクトを 2 つ作成し、それらをデータグリッドにバインドしようとしています。2 つのレシートのプロパティを入力して dataGridRows に追加しましたが、DataGrid に表示されません。

    public MainWindow()
    {
    InitializeComponent();
    makeReceipts()
    }

    public ObservableCollection<Receipt> dataGridRows = new ObservableCollection<Receipt>();

    public Receipt receipt1 = new Receipt();
    public Receipt receipt2 = new Receipt();

    public void makeReceipts()
    {
    receipt1.Id = 1;
    receipt1.Price = 10;
    receipt1.Store = "Brugsen";
    receipt1.Date = DateTime.Today;

    receipt2.Id = 2;
    receipt2.Price = 15;
    receipt2.Store = "Netto";
    receipt2.Date = DateTime.Today;

    dataGridRows.Add(receipt1);
    dataGridRows.Add(receipt2);
    }

そして、データグリッドに領収書を表示させたい MainWindow の xaml で:

    <DataGrid Name="ReceiptGrid" CanUserResizeColumns="True" IsReadOnly="True" AutoGenerateColumns="True" ItemsSource="{Binding Source=dataGridRows}" />

私は何を間違っていますか?

4

3 に答える 3

0

あなたの問題はあなたが書かなければならないことだと思います

ItemsSource="{Binding Path=dataGridRows}"

そしてそうではない

ItemsSource="{Binding Source=dataGridRows}"

source は、xaml ファイルで別のコントロールを指定することです

于 2013-07-04T15:00:14.663 に答える
0

まず、パブリック プロパティにバインドできます。したがって、バインディングを使用する場合は、少なくとも次のことを行う必要があります。

 public ObservableCollection<Receipt> dataGridRows {get;set;}

次に、次の 2 つの手順を実行する必要があります。

  1. 正しいデータコンテキストを設定する
  2. 正しいバインディング式 (パス) を設定します

グリッドのデータ コンテキストがプロパティ dataGridRows を持つオブジェクトであると仮定すると、バインディングは次のようになります。

 <DataGrid ItemsSource="{Binding Path=dataGridRows}" .../>
于 2013-07-04T14:17:09.997 に答える
0

まず、パブリック プロパティのみをバインドできるため、の定義を次のdataGridRowsように変更する必要があります。

public ObservableCollection<Receipt> dataGridRows { get; set; }

Source次に、それを a としてではなく としてバインドしますがPath、あなたdataGridRowsはで定義されているため、あなたのMainWindowように指定する必要がありSourceます。それ以外の場合は、ケースでは設定されていない MainWindowデフォルトで表示されますDataContext

<DataGrid ... ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=dataGridRows}" />

これは、そこでプロパティBindingを見つけWindowて探すように指示します。編集:通常、データを表示しません。MVVMデザインパターンについてもっと読むことをお勧めしますが、基本的には、インターフェイスを認識せずにアプリケーションロジック全体を配置するViewModelがあり、その上にユーザーと対話するビューがありますが、ViewModelではそうではありません.コントロールを操作しないでください。あなたがすべきことは、プロパティを使用してビューモデルクラスを作成し、たとえばそれを割り当てることです。それぞれにそれがあり、ソース ( 、、 )を指定しない場合、現在の解決を試みますdataGridRows



dataGridRowsDataContextWindowFrameworkElementBingingSourceRelativeSourceElementNameBinding.PathDataContext. 現在のコントロールに指定されていない場合は、ビジュアル ツリーの親に移動します。

于 2013-07-04T16:02:27.700 に答える