更新:请参阅此问题的底部,了解我为解决问题所采取的措施。
我正在尝试了解ItemsSource
和DataContext
属性在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
,则在呈现时不会显示任何数据。
我无法理解ItemsSource
和DataContext
应该如何运作,因为当我为它们分配List
对象时,我希望其中一个属性“正常工作”。我需要在代码中理解和更改哪些内容,以便在List
中更改数据时,网格中的数据会更新?
以下是我为解决问题所做的工作:
IssueSummaryList
更改为System.Collections.ObjectModel.ObservableCollection
类型。在集合中添加或删除项目时,ObservableCollection
对象会引发事件,告诉数据网格刷新其视图。GetDummyIssueSummary()
方法以直接修改IssueSummaryList
,而不是将其设置为List
或ObservableCollection
的新实例。这两个更改允许在组合框更改时刷新数据网格。
答案 0 :(得分:3)
DataContext
用于将依赖项属性值绑定到另一个源。 ItemsSource
用于ItemsControl
以提供要显示的对象列表。
如果您只想在代码中设置此列表而不是在XAML中或通过数据绑定表达式设置此列表,则不需要设置DataContext
(如果不是,则它也不会为您做任何事情你设置它)。还值得注意的是,用于绑定的数据上下文将递归地检查控件父级,直到找到非null值。换句话说,如果您的DataContext
是null
,那么它将检查控件的父级,然后检查其父级,依此类推,直到找到要使用的非空值(或者它到达结束时)链)。
当您说基础列表更改时它不会更新时,您指的是哪种更改?如果您说的是添加和删除项目,那么您使用的是哪种类型的集合?为了实现此目的,该类型需要实现INotifyCollectionChanged
或IBindingList
。 ObservableCollection<T>
实现了INotifyCollectionChanged
,因为这是此类事情的常见候选者。
如果您说对列表中内容的更改(意味着属性更改为列表中的项目,而不是列表本身的更改)未反映出来,那么您将会需要确保您的对象实现INotifyPropertyChanged
。
答案 1 :(得分:2)
ItemsSource
是项目的来源,DataContext
是绑定相对的位置。
E.g。
如果通过代码设置ItemsSource
,则DataContext
与ItemsSource
无关。
如果ItemsSource="{Binding MyList}"
,那么ItemsSource
将连接到数据上下文设置为+ .MyList
的位置。
如果ItemsSource="{Binding}"
,那么ItemsSource
将连接到数据上下文设置的位置。