将数据绑定添加到数据网格?

时间:2013-07-04 13:58:46

标签: wpf object data-binding binding datagrid

我有一个简单的数据结构:

在模型中我有

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

我已经制作了两个这样的对象,我试图将它们绑定到数据网格。我已经填写了两个收据的属性,并将它们添加到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显示我的收据:

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

我做错了什么?

3 个答案:

答案 0 :(得分:0)

首先,您可以绑定到公共属性。 所以如果你想使用绑定,你至少要做:

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

第二,你必须做两个步骤:

  1. 设置正确的datacontext
  2. 设置正确的绑定表达式(Path)
  3. 假设yyour网格的datacontext是一个具有属性dataGridRows的对象,您的绑定应该如下所示

     <DataGrid ItemsSource="{Binding Path=dataGridRows}" .../>
    

答案 1 :(得分:0)

认为你的问题是你必须写

ItemsSource="{Binding Path=dataGridRows}"

而不是

ItemsSource="{Binding Source=dataGridRows}"

source是在xaml文件中指定另一个控件

答案 2 :(得分:0)

首先,您只能绑定公共属性,因此您需要将dataGridRows的定义更改为以下内容:

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

然后您不会将其绑定为Source,而是绑定为Path,但是由于dataGridRows中定义了MainWindow,您需要指定Source }作为您的MainWindow,否则它会显示默认DataContext,而您的情况未设置

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

这告诉Binding找到Window并在那里寻找dataGridRows属性。

编辑:
通常,您不会将数据放入视图中。我建议你阅读更多关于MVVM设计模式的内容,但基本上你的想法是你有你的ViewModel,你在其中放入整个应用程序逻辑,不知道界面,然后在顶部你有你的视图与用户交互,但在ViewModel你不要操作控件。
您应该创建具有dataGridRows属性的视图模型类,并通过Window FrameworkElement分配它。每个Source都有它,当您未指定DataContext来源(RelativeSourceElementNameBinding.Path)时,它会尝试解析DataContext在当前{{1}}。如果当前控件没有指定它,那么是否将转到可视树中的父级,依此类推。