WPF DataGridRow.Item(xx) — опция Strict On запрещает позднее связывание

Приложение WPF, использующее DataGrid. Пользователь дважды щелкает ячейку, и мне нужно получить значение другой ячейки в этой строке.

Dim dep As DependencyObject = DirectCast(e.OriginalSource, DependencyObject)
Dim dgRow As DataGridRow = Nothing
While dep IsNot Nothing
    If TypeOf dep Is DataGridRow Then
        dgRow = DirectCast(dep, DataGridRow)
    End If
    dep = VisualTreeHelper.GetParent(dep)
End While

Итак, теперь у меня есть строка, я хочу получить значение из определенного столбца:

Dim xx As String = dgRow.Item("xx")

Это дает мне «Опция Strict On запрещает позднее связывание» без вариантов исправления. Он отлично работает с параметром Option Strict Off. Я пробовал все следующее, чтобы исправить это:

dgRow.Item("xx").ToString
DirectCast(dgRow.Item("xx"), String)
CType(dgRow.Item("xx"), String)

Однако красная волнистая линия остается под dgRow.Item("xx") во всех этих сценариях.

Цените любой вклад, включая альтернативные способы сделать это.

ОБНОВЛЕНИЕ

Вот код, который в итоге сработал. Я посмотрел на тип свойства Item, и это был DataRowView. Благодаря ответу Марка ниже.

dgRow = DirectCast(DirectCast(dep, DataGridRow).Item, DataRowView)

Это позволило мне сделать это без ошибки позднего связывания:

dgRow.Item("xx").ToString

person tolsen64    schedule 03.08.2015    source источник


Ответы (1)


dgRow.Item является свойством типа Object. Используя dgRow.Item("xx"), вы пытаетесь вызвать свойство по умолчанию, которое для Object не существует, и поэтому выдает ошибку, которую вы видите.

Из части ("xx") похоже, что строка может быть привязана к какому-то словарю. Если это так, вам нужно будет привести dgRow.Item к соответствующему типу, прежде чем обращаться к его значению, например.

Dim xx As String = DirectCast(dgRow.Item, Dictionary(Of String, String))("xx")

ОБНОВЛЕНИЕ

Прочитав еще раз, похоже, что вы можете привязываться к DataTable, и в этом случае каждая строка будет привязана к DataRow, так что, возможно, вам нужно что-то вроде этого:

Dim xx As String = DirectCast(dgRow.Item, DataRow).Field(Of String)("xx")

Обратите внимание: вам может потребоваться добавить ссылку на System.Data.DataSetExtensions.dll для Field метод должен быть доступен.

person Mark    schedule 03.08.2015
comment
Спасибо! Это помогло мне исправить это. Я отредактировал свой вопрос, включив в него свой окончательный код. - person tolsen64; 03.08.2015