2011-03-28 138 views
5

我在我的WPF应用程序中有一个Datagrid控件,我试图将该控件绑定到我的主窗口类中的ObservableCollection属性。我想绑定到财产的定义是:WPF ItemsSource绑定

private ObservableCollection<RequestResult> m_SentRequests = new ObservableCollection<RequestResult>(); 
public ObservableCollection<RequestResult> SentRequests { get { return m_SentRequests; } } 

我的DataGrid是一组由具有在DataContext设置到主窗口:

<GroupBox Header="Results" Height="275" HorizontalAlignment="Stretch" Margin="0,305,0,0" Name="grpResults" VerticalAlignment="Top" Width="712" DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=my:MainWindow, AncestorLevel=1}}"> 
    <Grid> 
     <DataGrid AutoGenerateColumns="False" Height="246" HorizontalAlignment="Stretch" Margin="6,6,6,0" Name="dgResults" VerticalAlignment="Top" ItemsSource="{Binding Path=SentRequests}" DataContext="{Binding}" IsSynchronizedWithCurrentItem="True" /> 
    </Grid> 
</GroupBox> 

的问题我有是在属性窗口中,在选择SentRequests作为我的ItemsSource之后,我仍然无法选择“编辑属性绑定列”选项。我得到一个“您必须先设置ItemsSource,然后才能执行此操作”对话框。选择“生成列”和“删除列”时出现相同的错误。就好像我没有在ItemsSource属性中为我的对话框设置任何东西。

虽然我可以将AutoGenerateColumns设置为true,但我发现我的数据已经绑定(但是不是与我想要显示的列)。

我对WPF很陌生,我只是写这个测试Windows服务的快速测试应用程序。

任何人知道我在做什么错在这里?

+0

DataGrid中的'DataContext =“{Binding}”'是多余的,我想,因为通常DataContext被继承。 – 2011-03-28 19:48:05

+0

@ H.B。谢谢,我做了清理。它没有什么区别(不是你期望的)。可能是我尝试多件事的一个神器。 – Redbaran 2011-03-28 20:03:08

回答

1

您是否尝试过没有DataContext标签?在GroupBox和DataGrid中。

编辑

是这样的:

<GroupBox Header="Results" Height="275" HorizontalAlignment="Stretch" > 
    <Grid> 
     <DataGrid AutoGenerateColumns="False" Height="246" HorizontalAlignment="Stretch" Name="dgResults" VerticalAlignment="Top" ItemsSource="{Binding Path=SentRequests}" IsSynchronizedWithCurrentItem="True" /> 
    </Grid> 
</GroupBox> 
+0

我不确定你的意思,你能更具体吗?现在,XAML标记是由Visual Studio生成的。 – Redbaran 2011-03-28 19:46:28

+0

丹尼尔,那不行。如果没有设置datacontext,我的属性上的get不会再被调用,也不允许我使用Properties窗口来编辑列。 – Redbaran 2011-03-28 20:04:05

2

这可能是一些挂羊头卖狗肉的结果,设计师确实呈现不经常编译(如跳绳代码隐藏构造函数)。尝试将你的集合移动到一个单独的类,并使用它的一个实例作为你的DataContext(如MVVM ViewModel)。其他类应该能够正常初始化并向设计者提供绑定属性。

3

我不相信你需要itemSource中的Path参数。你应该能够只设定为的ItemsSource = {结合SentRequests}绑定

您也可以绑定到网格项目源,例如代码,如果我创建一个虚拟集合:

public class People 
{ 

    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Age { get; set; } 
    public string address { get; set; } 
    public string zip { get; set; } 
} 

,然后填充它

this.AllPeople = new ObservableCollection<People>(); 


     private void FillData() 
    { 
     People p1 = new People(); 
     p1.FirstName = "John"; 
     p1.LastName = "Doe"; 
     p1.Age = "24"; 
     p1.address = "123 Main Street"; 
     p1.zip = "11111"; 

     People p2 = new People(); 
     p2.FirstName = "Jane"; 
     p2.LastName = "Smith"; 
     p2.Age = "36"; 
     p2.address = "456 Water Street"; 
     p2.zip = "22222"; 

     People p3 = new People(); 
     p3.FirstName = "Larry"; 
     p3.LastName = "Williams"; 
     p3.Age = "24"; 
     p3.address = "785 Water Street"; 
     p3.zip = "33333"; 

     this.AllPeople.Add(p1); 
     this.AllPeople.Add(p2); 
     this.AllPeople.Add(p3); 
    } 

我可以然后设置在炫魅contsructor或方法的项目源:

this.gridviewname.ItemsSource = “AllPeople”;

+0

它也可以在设计师中使用吗? – 2011-05-10 17:33:13

+0

你能解释一下设计师的意思吗?你是指绑定?如果是这样,那么是将项目源设置为集合,你应该很好去。 – rlcrews 2011-05-10 19:24:14