我正在使用WPF DataGrid
,我希望使用DataGridCell
和column
索引检索row
的值:我能做的就是这但它没有用:
myDatGrid.Columns[0].GetCellContent((DataGridRow)myDatGrid.Items[0]);
请你告诉我实现这个目标的方法
答案 0 :(得分:0)
您的单元格值将取决于给定列绑定的内容。整个行将是您模型的实例。
假设我们在Person
内绑定了DataGrid
个类的集合。
Person p = ((ContentPresenter)myDatGrid.Columns[0].GetCellContent(myDatGrid.Items[0])).Content;
Content
属性将返回行的基础模型。如果你想获得一个给定的属性,你可以通过直接访问应该实现INotifyPropertyChanged
的underyling对象来实现,不需要像在WinForms应用程序中那样愚弄DataGrid
。
答案 1 :(得分:0)
好吧我想我得到了它,我错过了一些我应该放的演员表,因为我使用的专栏是DataGridComboBoxColumn
我应该这样做:
((ComboBox)(myDatGrid.Columns[0].GetCellContent(
(TestData)myDatGrid.Items[0]))).SelectedValue.ToString());
现在可行。
答案 2 :(得分:0)
我尝试了上面提出的建议并且没有用。
我挣扎了一整天试图绑定一个ComboBox并在第一次加载时在WPF Datagrid中选择正确的值,所以我想我会在这里分享我的解决方案,希望其他人可以受益。抱歉VB,但这个概念也适用于C#。
首先,如果您尝试在网格首次加载时填充并选择值,则需要将代码放在正确的事件处理程序中:LayoutUpdated。在其他事件处理程序中,GetCellContent函数返回Nothing(null)。您还可以将此代码放在事件处理程序中,以处理稍后发生的事件,例如Button.Click事件(如果符合您的要求)。
其次,代码:
For i As Int32 = 0 To DataGrid1.Items.Count - 1
Dim row As DataGridRow
row = DataGrid1.ItemContainerGenerator.ContainerFromItem(DataGrid1.Items(i))
If row IsNot Nothing AndAlso row.Item IsNot Nothing Then
Dim cp As ContentPresenter = DataGrid1.Columns(3).GetCellContent(DataGrid1.Items(i))
If cp IsNot Nothing AndAlso cp.ContentTemplate IsNot Nothing Then
Dim dt As DataTemplate = cp.ContentTemplate
If dt IsNot Nothing Then
Dim cb As ComboBox = dt.FindName("cbVendorNames", cp)
If cb IsNot Nothing Then
cb.ItemsSource = Vendors
cb.DisplayMemberPath = "VendorName"
cb.SelectedValuePath = "AS_ID"
cb.SelectedValue = "" ' set your selected value here
End If
End If
End If
End If
Next
这段代码的作用是(a)循环遍历数据网格中的所有行,(b)获取所选单元格的ContentPresenter(在本例中为每行中的单元格3),(c)获取DataTemplate ContentPresenter,(d)最后得到ComboBox的引用。这允许我将ComboBox绑定到外部数据源(List(Of Vendor)并选择它的值。这段代码对我有用。
我发现这种解决方案不是特别优雅或高效,但确实有效。如果有人有更好的解决方案,请发布。