WPF中的数据网格绑定

31

我知道这个问题已经被问过了,但是我已经几乎尝试了所有开发者建议的东西。

<DataGrid x:Name="Imported" VerticalAlignment="Top"
          DataContext="{Binding Source=list}"
          AutoGenerateColumns="False" CanUserResizeColumns="True">
    <DataGrid.Columns>                
        <DataGridTextColumn Header="ID" Binding="{Binding Path=ID}"/>
        <DataGridTextColumn Header="Date" Binding="{Binding Path=Date}"/>
    </DataGrid.Columns>
</DataGrid>

我正在尝试在模态对话框中显示它,并在模态对话框的构造函数中填充许可证列表。但是,在DataGrid内仍然没有填充任何内容。

构造函数代码:

public diagboxclass()
{
    List<object> list = new List<object>();
    list = GetObjectList();
}
public class object
{
    string id;
    DateTime date;
    public string ID
    {
        get { return id; }
        set { id = value; }
    }
    public DateTime Date
    {
        get { return date; }
        set { date = value; }
    }
}

你们认为这与对象列表有关吗?


我的列表对象有比上面两个我没有绑定的其他属性,这会有什么影响吗? - alice7
可能不是这样。请分享更多您的XAML代码(包括list的定义),以便我们能够提供更进一步的帮助。 - Dan J
我已经在顶部添加了代码。 - alice7
@alice7 diagboxclass是什么类型?XAML类中包含DataGrid的类型是什么?如果diagboxclass在XAML文件的代码后台中,您应该将list分配给该类的DataContext属性。然后,您就可以从XAML内部绑定到列表。 - Dan J
2
嗨,如果2011年的任何一个答案对您有帮助,请将其标记为答案,谢谢。 - WiiMaxx
显示剩余2条评论
3个回答

45

请不要使用object作为类名:

public class MyObject //better to choose an appropriate name
{
    string id;
    DateTime date;
    public string ID
    {
       get { return id; }
       set { id = value; }
    }
    public DateTime Date
    {
       get { return date; }
       set { date = value; }
    }
}
你应该为这个类实现INotifyPropertyChanged接口,并当然在属性的setter方法中调用它。否则更改不会在UI上反映出来。
你的ViewModel类/对话框类应该有一个MyObject列表的Property。使用ObservableCollection<MyObject>即可:
public ObservableCollection<MyObject> MyList
{
     get...
     set...
}

在你的 xaml 中,你应该将 Itemssource 设置为你的 MyObject 集合。(注意 Datacontext 必须是你的对话框类!)

<DataGrid ItemsSource="{Binding Source=MyList}"  AutoGenerateColumns="False">
   <DataGrid.Columns>                
     <DataGridTextColumn Header="ID" Binding="{Binding ID}"/>
     <DataGridTextColumn Header="Date" Binding="{Binding Date}"/>
   </DataGrid.Columns>
</DataGrid>

7
在我的情况下,DataGrid的ItemSource应该是:ItemsSource="{Binding MyList}"。 - RHAD

24

没有看到对象列表,我认为您应该绑定到DataGridItemsSource属性,而不是它的DataContext

<DataGrid x:Name="Imported" VerticalAlignment="Top"
          ItemsSource="{Binding Source=list}"
          AutoGenerateColumns="False" CanUserResizeColumns="True">
    <DataGrid.Columns>                
        <DataGridTextColumn Header="ID" Binding="{Binding ID}"/>
        <DataGridTextColumn Header="Date" Binding="{Binding Date}"/>
   </DataGrid.Columns>
</DataGrid>

假设包含DataGrid的元素[UserControl,等等]已将其DataContext绑定到包含list集合的对象上。 DataGrid派生自ItemsControl,后者依靠其ItemsSource属性定义将其行绑定到的集合。 因此,如果list不是绑定到控件的DataContext的对象的属性,则您可能需要在DataGrid上设置DataContext={Binding list}ItemsSource={Binding list}


我已经删除了整个内容,只留下了数据网格。所以没有其他控件。这是构造函数内的代码:List<object> objectList = new List<object>(); objectList = GetObjectList(); - alice7
1
在构造函数内部...什么?请编辑您的问题(单击标签下方出现的“编辑”链接),以包含更多代码;在评论中阅读非常困难。谢谢 :) - Dan J
2
@alice7:你需要将那个列表公开为一个公共属性,并设置适当的DataContext,你可能需要阅读这个参考链接 - H.B.
@djacobson:这个归你了。 - H.B.
1
ItemsSource 属性中的绑定可能有误。在我的情况下,当我使用“{Binding Source=list}”来声明绑定时,没有成功。但是,当我使用“{Binding list}”来声明绑定时,是成功的。 - kbisang
显示剩余2条评论

5

尝试在后台代码中执行以下操作:

public diagboxclass()
{
    List<object> list = new List<object>();
    list = GetObjectList();
    Imported.ItemsSource = null;
    Imported.ItemsSource = list;
}

请确保列表有效地填充,并且不要使用C#中已经具有功能的单词,就像@Blindmeis所说的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接