DataGridTemplateColumn Two way binding is not working

data-binding, datagrid, datagridtemplatecolumn, two-way-binding, wpf

Solution

I had the same problem, not updating the source:

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

For me it worked just adding `UpdateSourceTrigger=PropertyChanged`

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

Problem

I've got a `DataGrid` I've bound to a `SqlDataApter`. If I set up the XAML for the grid using `DataTextColumn` as illustrated in the code below it works perfectly ``` <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 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> </DataGrid> ``` I am binding this to a `DataTable` in code using: ``` dataGrid1.ItemsSource = dTable.DefaultView ``` And I have a button that saves the changes using the ذSqlDataAdapterذ update method: ``` dAdapter.Update(dTable) ``` The problem is that I want to disable editing the `IC_DEF_CHAR_TEXT` field when the record `isNumeri`c and the `IC_DEF_CHAR_TEXT` when the record `IsText`. I tried binding to the `IsReadOnly` property but found that it is not bind-able, so I created templates for the two fields and bound the `IsEnabled` property to the `IsText` and `IsNumeric` fields. ``` <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 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> </DataGrid> ``` This worked exactly like I wanted, the textboxes were enabled when necessary. However the changes made in the `TextBoxes` are no longer saved to the database during update. Can someone out there explain to me why the database is no longer being updated?

Original source