Base de datos.

Ahora que controlas la clase 'Binding' ha llegado la hora de estudiar el enlace a datos con fuentes externas. Hay varias maneras de almacenar los datos que va a utilizar una aplicación pero, de entre todos ellos, la más potente son las bases de datos. No es objetivo de este curso el estudio de las bases de datos, así que para seguir adelante antes deberás documentarte de este asunto, especialmente en el lenguaje de bases de datos SQL. Además, debes tener en cuenta que para este caso vamos a utilizar bases de datos SQLite, que es una versión simple de SQL muy adaptable a pequeñas aplicaciones de escritorio que no necesitan de bases de datos en servidor.

Vamos a suponer que nuestra aplicación posee una base de datos muy simple (y más que suponer, tendrás que crearla e ingresar algunos registros) que almacena los registros que se han creado en cada creación de una copia de seguridad. Tendrá un solo campo llamado 'backupDate' de tipo texto que representará la fecha de creación de la copia de seguridad. Ahora queremos mostrar en una ventana, concretamente en un control 'DataGrid', el listado de copias de seguridad que hemos creado para que el usuario tenga conocimiento de cuántas copias de seguridad creó y cuándo. Evidentemente, de alguna manera tendremos que ejecutar una sentencia de consulta a la base de datos e, inmediateamente, adaptar estos datos al control 'DataGrid' para su correcta visualización.

Para ello vamos primero a crear un estilo para el control 'DataGrid':

<Style x:Key="styleDataGrid" TargetType="{x:Type DataGrid}">
    <Setter Property="AutoGenerateColumns" Value="False"/>
    <Setter Property="CanUserAddRows" Value="False"/>
    <Setter Property="CanUserDeleteRows" Value="False"/>
    <Setter Property="CanUserReorderColumns" Value="False"/>
    <Setter Property="CanUserResizeColumns" Value="True"/>
    <Setter Property="CanUserResizeRows" Value="True"/>
    <Setter Property="CanUserSortColumns" Value="True"/>
    <Setter Property="Height" Value="300"/>
    <Setter Property="IsTabStop" Value="False"/>
    <Setter Property="Margin" Value="10"/>
    <Setter Property="SelectionMode" Value="Single"/>
    <Setter Property="Width" Value="300"/>
</Style>

Aquí hemos utilizado varias propiedades del control 'DataGrid' que por su propio nombre comprenderás para qué se usan. Solamente te explico que al establecer el valor de la propiedad 'AutoGenerateColumns' en 'False', indicamos que seremos nosotros los que estableceremos los encabezados de las columnas del 'DataGrid', pues de lo contrario WPF tomará los nombres de los campos de la base de datos, en este caso 'backupDate'.

A continuación crearemos el control 'DataGrid' que se basará en el estilo anterior:

<DataGrid x:Name="dataGridBackups" Style="{StaticResource ResourceKey=styleDataGrid}" ItemsSource="{Binding linkDataBackups}">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Path=backupDate}">
            <DataGridTextColumn.Header>
                <TextBlock Text="FECHA"/>
            </DataGridTextColumn.Header>
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

Hemos creao una clave llamada 'linkDataBackups' que utilizaremos en el código subyacente en C# para enlazar la consulta de la base de datos con el 'DataGrid'. Para ello tenemos que irnos al archivo 'MainWondw.xaml.cs', que, cmo sabes, es el archivo de código subyacente de la ventana, y añadir en el evento 'Loaded' de la página principal una llamada al método 'UpdateDataGridBakcups', que también incluiremos en el archivo:

private void backupsWindow_Loaded(object sender, RoutedEventArgs e) => UpdateListViewBackups();
private void UpdateListViewBackups()
{
    using(SQLiteConnection connectionSQLiteBackups = new SQLiteConnection("Data Source=|DataDirectory|\backups.db;Version=3;New=False;Compress=True;Read Only=False;")
    {
        connectionSQLiteBackups.Open();
        SQLiteDataAdapter dataAdapterSQLite = new SQLiteDataAdapter(new SQLiteCommand("SELECT * FROM backupsData", connectionSQLiteBackups));
        var dataSet = new DataSet();
        dataAdapterSQLite.Fill(dataSet, "linkDataBackups");
        dataGridBackups.DataContext = dataSet;
    }
}

Hemos establecido una conexión con la base de datos 'backups.db' a través de su cadena de conexión, y hemos realizado una consulta de todos sus tegistros de la tabla 'backupsData' que volcamos a un objeto de la clase 'DataSet'. Posteriormente, enlazamos este objeto con el 'DataGrid' a través de la clave 'linkDataBackups', y ya está. Al ejecutar la aplicación se llamará al evento 'Loaded' de la ventana y éste a su vez llamará al método que hace la consulta a la base de datos y la traspasa al 'DataGrid'. Automáticamente se volcarán los datos de la tabla al 'DataGrid'.

Si en esta ventana estableciéramos la posibilidad de modificar los registros de la base de datos, después de cada acción sería imprescindible llamar de nuevo al método 'UpdateListViewBackups' para que el 'DataGrid' se actualizase con los nuevos datos, ya que sería necesaria una nueva consulta a la base de datos para que el 'DataGrid' tuviera conocimiento de los cambios.