我有一个简单的数据结构:
在模型中我有
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}" />
我做错了什么?
答案 0 :(得分:0)
首先,您可以绑定到公共属性。 所以如果你想使用绑定,你至少要做:
public ObservableCollection<Receipt> dataGridRows {get;set;}
第二,你必须做两个步骤:
假设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
来源(RelativeSource
,ElementName
,Binding.Path
)时,它会尝试解析DataContext
在当前{{1}}。如果当前控件没有指定它,那么是否将转到可视树中的父级,依此类推。