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?
CellTemplate
to not use two-way binding as it's essentially only supposed to act as a window. – RiehlTextBox
will default toTwo-Way
, try changing it toOne-Way
on theCellTemplate
. You only wantTwo-Way
onCellEditingTemplate
– RiehlDataGrid
. – Starch