Binding y ViewModel
El campo representa Entry TwoWay; la salida representa Label OneWay.
04 / PRACTICAR
Simulaciones en JavaScript para aprender el modelo mental. No son un emulador de MAUI ni una base SQLite real.
EXAMEN PRÁCTICO
Diagnostica código que falla, decide una corrección y explica por qué funciona.
Entrenar con escenarios →El campo representa Entry TwoWay; la salida representa Label OneWay.
Elige una respuesta simulada; no se abrirá tu cámara.
LABORATORIO DE NOTAS
Este modelo usa almacenamiento del navegador. Agrega, edita o elimina una nota; después elimina el proceso simulado y reconstruye la lista desde los datos guardados.
La tarea simulada espera dos segundos. Durante la espera puedes pulsar el contador. No ejecuta C#.
_db.CreateTableAsync<Nota>();
return _db.Table<Nota>().ToListAsync();
private readonly SQLiteAsyncConnection _db;
private readonly Task _ready;
public NotaRepository(string ruta)
{
_db = new SQLiteAsyncConnection(ruta);
_ready = _db.CreateTableAsync<Nota>();
}
public async Task<List<Nota>> LeerAsync()
{
await _ready;
return await _db.Table<Nota>().ToListAsync();
}
Fragmento educativo: requiere los paquetes, imports y contexto del proyecto correspondientes.
notas[0].Texto = "Editada";
public partial class Nota : ObservableObject
{
[ObservableProperty] private string texto = "";
}
// La colección permanece igual.
Notas[0].Texto = "Texto corregido";
Fragmento educativo: requiere los paquetes, imports y contexto del proyecto correspondientes.
var datos = cliente.GetStringAsync(url).Result;
[RelayCommand]
private async Task SincronizarAsync()
{
try
{
Mensaje = await _http.GetStringAsync("posts");
}
catch (HttpRequestException)
{
Mensaje = "No se pudo contactar el servidor.";
}
}
Fragmento educativo: requiere los paquetes, imports y contexto del proyecto correspondientes.
if (!Notas.Any(n => n.Texto == remota.Body))
Guardar(remota);
// Esquema: requiere un índice único por IdRemoto en el modelo.
var local = await repo.BuscarPorIdRemotoAsync(remota.Id);
if (local is null)
await repo.InsertarRemotaAsync(remota);
else
await repo.AplicarPoliticaDeConflictoAsync(local, remota);
// El contrato del servidor debe permitir reintentos idempotentes.
Fragmento educativo: requiere los paquetes, imports y contexto del proyecto correspondientes.
var loc = await Geolocation.Default.GetLocationAsync();
Mostrar(loc.Latitude);
try
{
var request = new GeolocationRequest(
GeolocationAccuracy.Medium, TimeSpan.FromSeconds(10));
var loc = await Geolocation.Default.GetLocationAsync(request);
if (loc is null) { Mensaje = "Sin ubicación disponible"; return; }
Latitud = loc.Latitude;
Longitud = loc.Longitude;
}
catch (PermissionException) { Mensaje = "Ubicación no autorizada"; }
catch (FeatureNotEnabledException) { Mensaje = "Activa la ubicación si deseas usarla"; }
// Tratar también cancelación y otros fallos según la plataforma.
Fragmento educativo: requiere los paquetes, imports y contexto del proyecto correspondientes.
record Grupo(List<string> Nombres);
grupo.Nombres.Add("Luis");
// Requiere System.Collections.Immutable.
public record Grupo(ImmutableArray<string> Nombres);
var original = new Grupo(ImmutableArray.Create("Ana"));
var nuevo = original with { Nombres = original.Nombres.Add("Luis") };
// original tiene Ana; nuevo tiene Ana y Luis.
Fragmento educativo: requiere los paquetes, imports y contexto del proyecto correspondientes.
Corrección inmediata con explicación.