I have a read only DataGrid
in MainWindow
populated with a list of a custom type. I want to edit each row separately in another window that uses TextBoxes
. I get to bind everything correctly, but I can see how de DataGrid
gets updated simultaneously in the background when I change a TextBox
. I want it to update when I click on my save button, so I can validate the new values.
XAML of Datagrid
:
<DataGrid x:Name="dgCb" Grid.Row="0"
BorderBrush="{DynamicResource Vetrotec.AzulOscuro}"
Background="{DynamicResource Vetrotec.AzulFondoTabla}"
AutoGenerateColumns="False"
CanUserReorderColumns="False"
CanUserSortColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
IsReadOnly="True"
SelectionUnit="FullRow"
SelectionMode="Single"
Language="es-ES">
<DataGrid.ColumnHeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="FontFamily" Value="Arial"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="Pos." Width="0.35*" IsReadOnly="True"
Binding="{Binding Posicion}" />
<DataGridComboBoxColumn x:Name="colCodigo" Header="Codigo" Width="0.75*"
SelectedValueBinding="{Binding IdMaterial}"
DisplayMemberPath="Codigo"
SelectedValuePath="Id" />
<DataGridComboBoxColumn x:Name="colDescripcion" Header="Descripcion" Width="2*"
SelectedValueBinding="{Binding IdMaterial}"
DisplayMemberPath="Descripcion"
SelectedValuePath="Id" />
<DataGridTextColumn Header="Cant." Width="0.5*"
Binding="{Binding Cantidad}" />
<DataGridTextColumn Header="Ancho" Width="0.5*"
Binding="{Binding Ancho}" />
<DataGridTextColumn Header="Alto" Width="0.5*"
Binding="{Binding Alto}" />
<DataGridTextColumn Header="Fecha Lote" Width="0.75*"
Binding="{Binding FechaLote, StringFormat=d}" />
<DataGridTextColumn Header="Lote" Width="*"
Binding="{Binding Lote}" />
<DataGridTextColumn Header="Proveedor" Width="*"
Binding="{Binding Proveedor}" />
</DataGrid.Columns>
</DataGrid>
Button
to modify DataGrid
row:
private void btnModificarLinea_Click(object sender, RoutedEventArgs e)
{
if (dgCb.SelectedItem == null)
{
MessageBox.Show("No se ha seleccionado ninguna línea.");
return;
}
string pathCodigos = Properties.Settings.Default.RutaCodigos;
ModificarStock wModificarStock = new ModificarStock();
wModificarStock.Tipo = ModificarStock.TipoModificacion.Modificar;
wModificarStock.LineaStock = (Material)dgCb.SelectedItem;
wModificarStock.Codigos = CodigosMaterial.ObtenerCodigos(pathCodigos, ';');
wModificarStock.Closed += ModificarStock_Closed;
wModificarStock.ShowDialog();
}
External window to modify DataGrid
:
public partial class ModificarStock : Window
{
public MainWindow.Material LineaStock { get; set; }
public List<MainWindow.CodigosMaterial> Codigos { get; set; }
public TipoModificacion Tipo { get; set; }
public bool CambioAceptado { get; set; }
public enum TipoModificacion
{
Insertar,
Modificar
}
public ModificarStock()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
DataContext = LineaStock;
cbIdMaterial.ItemsSource = Codigos;
cbCodigo.ItemsSource = Codigos;
cbDescripcion.ItemsSource = Codigos;
if (Tipo == TipoModificacion.Modificar)
{
tbPosicion.IsEnabled = false;
}
}
private void btnAceptar_Click(object sender, RoutedEventArgs e)
{
CambioAceptado = true;
foreach (TextBox tb in MyGrid.Children.OfType<TextBox>())
{
if (Validation.GetHasError(tb))
{
MessageBox.Show("Se ha detectado un error en algún campo.");
CambioAceptado = false;
}
}
if (CambioAceptado)
{
Close();
}
}
}