了解DataGrid中的ItemsSource和DataContext

时间:2010-06-14 17:29:17

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

更新:请参阅此问题的底部,了解我为解决问题所采取的措施。

我正在尝试了解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的新实例。

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

2 个答案:

答案 0 :(得分:3)

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

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

当您说基础列表更改时它不会更新时,您指的是哪种更改?如果您说的是添加和删除项目,那么您使用的是哪种类型的集合?为了实现此目的,该类型需要实现INotifyCollectionChangedIBindingListObservableCollection<T>实现了INotifyCollectionChanged,因为这是此类事情的常见候选者。

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

答案 1 :(得分:2)

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

E.g。

如果通过代码设置ItemsSource,则DataContextItemsSource无关。

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

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