Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

DataGridTemplateColumn Two way binding is not working

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 isNumeric 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?

like image 794
David Potter Avatar asked Aug 13 '13 18:08

David Potter


2 Answers

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}"/>
like image 117
jrivam Avatar answered Nov 08 '22 19:11

jrivam


I had the same problem and the solution posted by @jrivam did not help. For me to get my binding to work correctly I had to change the CellEditingTemplate to use the OneWayToSource Binding Mode.

<DataGridTemplateColumn.CellEditingTemplate>
    <DataTemplate>
        <TextBox Text="{Binding Path=IC_DEF_CHAR_TEXT,
                 Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"/>
    </DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
like image 45
Chris J Avatar answered Nov 08 '22 18:11

Chris J