【问题标题】:Understanding ItemsSource and DataContext in a DataGrid了解 DataGrid 中的 ItemsSource 和 DataContext
【发布时间】:2011-03-03 15:16:24
【问题描述】:

更新:请参阅此问题的底部,了解我为解决问题所做的工作。

我试图了解 ItemsSourceDataContext 属性在 Silverlight 工具包 DataGrid 中的工作原理。我目前正在处理虚拟数据,并尝试在组合框的值更改时获取 DataGrid 中的数据以更新。

我的 MainPage.xaml.vb 文件目前如下所示:

Partial Public Class MainPage
    Inherits UserControl

Private IssueSummaryList As List(Of IssueSummary)    

Public Sub New()
    GetDummyIssueSummary("Day")
    InitializeComponent()
    dgIssueSummary.ItemsSource = IssueSummaryList
    'dgIssueSummary.DataContext = IssueSummaryList        '
End Sub

Private Sub GetDummyIssueSummary(ByVal timeInterval As String)
    Dim lst As New List(Of IssueSummary)()
    'Generate dummy data for lst '
    IssueSummaryList = lst
End Sub

Private Sub ComboBox_SelectionChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs)
    Dim cboBox As ComboBox = CType(sender, ComboBox)
    Dim cboBoxItem As ComboBoxItem = CType(cboBox.SelectedValue, ComboBoxItem)
    GetDummyIssueSummary(cboBoxItem.Content.ToString())
End Sub

End Class

我的 XAML 目前正在寻找 DataGrid

<sdk:DataGrid x:Name="dgIssueSummary" AutoGenerateColumns="False" >
    <sdk:DataGrid.Columns>
        <sdk:DataGridTextColumn Binding="{Binding ProblemType}" Header="Problem Type"/>
        <sdk:DataGridTextColumn Binding="{Binding Count}" Header="Count"/>
    </sdk:DataGrid.Columns>
</sdk:DataGrid>

问题是,如果我将数据网格的ItemsSource属性的值设置为等于IssueSummaryList,它会在加载时显示数据,但在底层IssueSummaryList集合时不会更新变化。如果我将网格的DataContext设置为IssueSummaryList,渲染时不会显示任何数据。

我一定不明白ItemsSourceDataContext 应该如何工作,因为当我将List 对象分配给它们时,我希望其中一个属性“正常工作”。我需要了解和更改我的代码中的哪些内容,以便随着List 中的数据更改,网格中的数据也会更新?


这是我为解决问题所做的:

  • 首先,我将IssueSummaryList 更改为System.Collections.ObjectModel.ObservableCollection 类型。当从集合中添加或删除项目时,ObservableCollection 对象会引发事件,告诉数据网格刷新其视图。
  • 接下来,我将GetDummyIssueSummary() 方法更改为直接修改IssueSummaryList,而不是将其设置为ListObservableCollection 的新实例。

这两个更改允许在组合框更改时刷新数据网格。

【问题讨论】:

    标签: .net vb.net silverlight data-binding xaml


    【解决方案1】:

    ItemsSource 是项目的来源,DataContext 是绑定的相对位置。

    例如

    如果ItemsSource是通过代码设置的,那么DataContextItemsSource无关。

    如果ItemsSource="{Binding MyList}",则ItemsSource 连接到数据上下文设置为+ .MyList 的位置。

    如果ItemsSource="{Binding}",则ItemsSource 连接到数据上下文设置的位置。

    【讨论】:

      【解决方案2】:

      DataContext 用于将依赖属性值绑定到另一个源。 ItemsSource 用于 ItemsControl 以提供要显示的对象列表。

      如果您只想在您的代码中而不是在 XAML 中或通过数据绑定表达式设置此列表,则不需要设置 DataContext(如果您这样做,它也不会为您做任何事情设置它)。还值得注意的是,用于绑定的数据上下文将递归检查控件父级,直到找到非空值。换句话说,如果您的DataContextnull,那么它将检查控件的父级,然后是其父级,依此类推,直到找到要使用的非空值(或到达链的末尾)。

      当您说底层列表更改时它不会更新时,您指的是哪种更改?如果您说的是添加和删除项目,那么您使用的是什么类型的集合?为了使其工作,该类型需要实现INotifyCollectionChangedIBindingListObservableCollection&lt;T&gt; 实现 INotifyCollectionChanged 是此类事情的常见候选者。

      如果您说对列表的 内容 的更改(意味着对列表中的项目的属性更改,而不是对列表本身的更改)没有反映,那么您将需要确保您的对象实现INotifyPropertyChanged

      【讨论】:

      • 澄清,如果对列表中已显示项目内容的更改未反映,请使用 INotifyPropertyChanged。
      • @Danny:这就是我的意思,尽管我承认这并不完全清楚。我试图区分对列表的更改(添加、删除、重新排序等)和对其项目的更改(属性更改)。我会尝试编辑以使其更清晰。
      • 感谢您的回复。我将IssueSummaryList 更改为ObservableCollection 并相应地修改了GetDummyIssueSummary(),但是当IssueSummaryList 重置时网格仍然没有更新。我已经将 dgIssueSummary.ItemsSource 设置为我的构造函数,但它似乎并没有“坚持”。
      • @Ben: IssueSummaryList 是一个实例变量。当您在构造函数中设置ItemsSource = IssueSummaryList 时,对IssueSummaryList 的后续更改不会自动反映在网格中(就像任何其他变量一样)。您需要再次设置ItemsSource 属性。
      • 这是有道理的。我修改了我的GetDummyIssueSummary() 方法以直接修改IssueSummaryList,而不是将其设置为ObservableCollection 的新实例,这使它正常工作。再次感谢您的帮助。
      猜你喜欢
      • 1970-01-01
      • 2010-12-02
      • 2010-11-24
      • 2015-10-06
      • 2011-03-11
      • 1970-01-01
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多