DataGridTemplateColumn Двухсторонняя привязка не работает

У меня есть datagrid, который я привязал к SqlDataApter. Если я настроил XAML для сетки, используя DataTextColumn, как показано в коде ниже, он отлично работает

<DataGrid AutoGenerateColumns="False" HorizontalAlignment="Left" Margin="27,42,0,0" Name="dataGrid1" VerticalAlignment="Top"  AreRowDetailsFrozen="True">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding KEY}" Visibility="Hidden" IsReadOnly="True"></DataGridTextColumn>
            <DataGridTextColumn Binding="{Binding CHARACTERISTIC_CODE}" Header="Unit" IsReadOnly="True" />
            <DataGridTextColumn Binding="{Binding UNIT_CHAR}" Header="Unit" IsReadOnly="True" />
            <DataGridTextColumn Binding="{Binding IC_DEF_CHAR_NUMERIC}" Header="Number" IsReadOnly="False"/>
            <DataGridTextColumn Binding="{Binding IC_DEF_CHAR_TEXT}"  Header="Text" IsReadOnly="False" />
            <DataGridTextColumn Binding="{Binding IsNumeric}"  Header="Status" IsReadOnly="True" />
            <DataGridTextColumn Binding="{Binding IsText}" Header="Status" IsReadOnly="True" />
        </DataGrid.Columns>

Я связываю это с данными, содержащимися в коде, используя  dataGrid1.ItemsSource = dTable.DefaultView и есть кнопка, которая сохраняет изменения, используя метод обновления SqlDataAdapter  dAdapter.Update(dTable)

Проблема в том, что я хочу отключить редактирование поля IC_DEF_CHAR_TEXT, когда запись isNumeric и IC_DEF_CHAR_TEXT, когда запись IsText. Я попробовал привязку к свойству IsReadOnly, но обнаружил, что он не является связываемым, поэтому я создал шаблоны для двух полей и связал свойство IsEnabled с полями IsText и IsNumeric.

<DataGrid AutoGenerateColumns="False" HorizontalAlignment="Left" Margin="27,42,0,0" Name="dataGrid1" VerticalAlignment="Top"  AreRowDetailsFrozen="True">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding KEY}" Visibility="Hidden" IsReadOnly="True"></DataGridTextColumn>
            <DataGridTextColumn Binding="{Binding CHARACTERISTIC_CODE}" Header="Unit" IsReadOnly="True" />
            <DataGridTextColumn Binding="{Binding UNIT_CHAR}" Header="Unit" IsReadOnly="True" />
            <DataGridTemplateColumn Header="Numeric" >
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBox  Text="{Binding Path=IC_DEF_CHAR_NUMERIC, Mode=TwoWay}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                        <TextBox IsReadOnly="False"  Text="{Binding Path=IC_DEF_CHAR_NUMERIC, Mode=TwoWay,  UpdateSourceTrigger=PropertyChanged}" />
                </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="Text" >
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBox Text="{Binding Path=IC_DEF_CHAR_TEXT, Mode=TwoWay}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <TextBox Text="{Binding Path=IC_DEF_CHAR_TEXT, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>

Это работало точно так, как я хотел, текстовые поля были включены, когда это необходимо. Однако изменения, внесенные в текстовые поля, больше не сохраняются в базе данных во время обновления. Может ли кто-нибудь объяснить мне, почему база данных больше не обновляется?

Ответ 1

У меня была такая же проблема, не обновляя исходный код:

<DataGridTemplateColumn Header="Obs" IsReadOnly="False">
  <DataGridTemplateColumn.CellTemplate>
     <DataTemplate>
         <TextBox Name="txtObs" Width="80"  Text="{Binding Path=ObsPedido, Mode=TwoWay}"/>
      </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

Для меня это просто добавило UpdateSourceTrigger=PropertyChanged

<TextBox Name="txtObs" Width="80"  Text="{Binding Path=ObsPedido, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

Ответ 2

У меня была та же проблема, и решение, отправленное @jrivam, не помогло. Для меня, чтобы моя привязка работала правильно, мне пришлось изменить CellEditingTemplate, чтобы использовать режим привязки OneWayToSource.

    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <TextBox Text="{Binding Path=IC_DEF_CHAR_TEXT, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>