Datagrid — для двусторонней привязки требуется Path или XPath

Сценарий проблемы, с которой я сталкиваюсь, таков:

1. У меня есть сетка данных, в которой есть несколько DataGridTemplateColumn, в этом я отобразил текстовый блок, который должен отображать значение, выбранное из поля со списком.
2. Я применил триггеры взаимодействия (PreviewKeyDown, DropDownClosed ) и триггер события.
3. Я привязал значение свойств элементов управления и событий с помощью MVVM.
4. При добавлении/удалении/сохранении записи в сетку данных я получаю следующую ошибку. (Сетка данных - два- привязка пути требует Path или XPath.)

----------------Посмотреть--------------------------

<DataGrid VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch" RowStyle="{StaticResource ItemContStyle}"  AlternationCount="2" Name="lstExpenses"  AutoGenerateColumns="False"  Width="{Binding ActualWidth,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Canvas},Mode=OneWay}"  Height="{Binding ActualHeight,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Canvas}, Mode=OneWay}" ItemsSource="{Binding List,Mode=TwoWay}" SelectionUnit="Cell" DataGridCell.Selected="lstExpenses_Selected" SelectionMode="Extended"  IsReadOnly="{Binding Path=ReadOnlyList,Mode=OneWay}">
        <DataGrid.Columns>
                    <DataGridTemplateColumn Header="Expense Type">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Path=TypeID,Converter={StaticResource NameConverter},ConverterParameter=ExpenseType, Mode=TwoWay}" Style="{StaticResource CenterAlignment}"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                        <DataGridTemplateColumn.CellEditingTemplate>
                            <DataTemplate>
                                <ComboBox ItemsSource="{Binding Path=DataContext.Type, RelativeSource={RelativeSource AncestorType=DataGrid, Mode=FindAncestor},Mode=OneTime}" DisplayMemberPath="Type" SelectedValuePath="TypeID" MaxDropDownHeight="150"  Text="{Binding Path=DataContext.TypeText,RelativeSource={RelativeSource AncestorType=DataGrid,Mode=FindAncestor},Mode=OneWayToSource}" IsEditable="True" IsTextSearchEnabled="False" SelectedValue="{Binding RelativeSource={RelativeSource Self}, Path=DataContext.TypeID,Mode=TwoWay}">
                                <i:Interaction.Triggers>
                                   <i:EventTrigger EventName="PreviewKeyDown">
                                            <i:InvokeCommandAction Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}, Path=DataContext.PreviewKeyDownCommand}"                                   CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=DataGridRow, Mode=FindAncestor}}"/>
                                        </i:EventTrigger>
                                    </i:Interaction.Triggers>
                                    <ComboBox.Triggers>
                                        <EventTrigger RoutedEvent="TextBoxBase.TextChanged">
                                            <BeginStoryboard Name="DropDownOpen">
                                                <Storyboard>
                                                    <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsDropDownOpen">
                                                        <DiscreteBooleanKeyFrame Value="True" KeyTime="0:0:0" />
                                                    </BooleanAnimationUsingKeyFrames>
                                                </Storyboard>
                                            </BeginStoryboard>
                                        </EventTrigger>
                                   </ComboBox.Triggers>
                                </ComboBox>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellEditingTemplate>

             </DataGridTemplateColumn>
    </DataGrid.Columns>
    </DataGrid>

-----------------------------------------Вьюмодель-------- -------------------------------------------------- ---------------

Private Sub Type_PreviewKeyDown(param As Object)


        Dim dtrv As DataRowView
        If Keyboard.IsKeyDown(Key.Enter) Or Keyboard.IsKeyDown(Key.Tab) Then
            If IsNothing(param) OrElse Not TryCast(TryCast(param, System.Windows.Controls.DataGridRow).DataContext, DataRowView).IsEdit Then Exit Sub
            dtrv = TryCast(TryCast(param, System.Windows.Controls.DataGridRow).DataContext, DataRowView)
            Dim dtExpense As DataTable
            Dim dv As DataView
            dv = New DataView(Type)
            If Not (String.IsNullOrEmpty(_strType) Or _strType = "") Then
                dv.RowFilter = "Type = '" & _strType.Trim & "'"
            End If
            If dv.Count <= 0 Then
                MsgBox("" & _strType.Trim & " does not exist in the list.")
                TypeText = ""
                Exit Sub
                blnEventActivateListView = True
                Return
            End If
            CalculateExpenseAmounts(dtrv)
            List.AcceptChanges()
            ShowStatus(False)
        End If

Конец сабвуфера

Public Property List As DataTable
    Get
        If Not IsNothing(_dtList) Then
            Return _dtList
        else
        MsgBox("Hello")
        End If
    End Get
    Set(value As DataTable)
        _dtList = value
        OnPropertyChanged("List")
    End Set
End Property


Public ReadOnly Property Type As DataTable
    Get
        If IsNothing(_dtType) Then _dtType = _objModel.getType()
        Return _dtType
    End Get
End Property


Public Property TypeText As String
    Get
        Throw New NotImplementedException
    End Get
    Set(value As String)
        _strType = value
        If Not (Keyboard.IsKeyDown(Key.Up) Or Keyboard.IsKeyDown(Key.Down)) Then
            Dim strFilteredText As String
            Dim dv As DataView
            dv = Type.DefaultView
            strFilteredText = "Type like '" + value.ToLower + "%'"
            dv.RowFilter = strFilteredText
            Type.AcceptChanges()
        End If
    End Set
End Property

person Bhavika Manchanda    schedule 26.02.2016    source источник
comment
Вы читали stackoverflow.com/questions/24258860/ и stackoverflow.com/questions/22595101/   -  person xmorera    schedule 27.02.2016
comment
Привет, Ксавье, спасибо за ваше предложение. Я использую контекст данных для привязок, и он не равен нулю, я проверил, и второй сценарий заключается в том, что я извлекаю записи из таблицы данных, и здесь не используется концепция класса.   -  person Bhavika Manchanda    schedule 29.02.2016
comment
Ok. Извините, что не помогает.   -  person xmorera    schedule 01.03.2016