2 messaggi dal 04 novembre 2021
Salve a tutti,
ho iniziato da poco con xamarin, siate clementi con le scemenze che scriverò :-).
Ecco il problema:

Obiettivo: Stampare dati (stringhe) che ricevo ciclicamente (1 volta al secondo) da un interfaccia bluetooth
Problema: I dati sono ricevuti correttamente (verificato con debug) ma i testi delle label non vengono aggiornati

Codice:
Xaml: Definizione delle label:

<Label Text="{Binding MyStringProperty}"
x:Name="ampere"
FontSize="28"
TextColor="DarkBlue"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand"
AbsoluteLayout.LayoutBounds="5,360,380,50" />

<Label Text="{Binding MyStringProperty}"
x:Name="watt"
FontSize="28"
TextColor="DarkBlue"
HorizontalOptions="FillAndExpand"
VerticalOptions="CenterAndExpand"
AbsoluteLayout.LayoutBounds="5,390,380,50" />

Binding:
public partial class MainPage : ContentPage
{
private readonly Context ctx;


public MainPage()
{
InitializeComponent();
BindingContext = this;
MyStringProperty = "x";
Inizia();
}

private string myStringProperty;
public string MyStringProperty
{
get { return myStringProperty; }
set
{
myStringProperty = value;
OnPropertyChanged(nameof(MyStringProperty)); // Notify that there was a change on this property
}
}

Aggiornamento delle label:
public void Estrapola(String risposta)
{
Boolean amp = false;
Boolean wat = false;
String strix = "";
BindingContext = this;


for (int x = 0; x < risposta.Length ; x++)
{
switch (risposta.Substring(x,1))
{
case "A":
amp = true;
wat = false;
break;
case "W":
wat = true;
amp = false;
if (strix != "")
{
MyStringProperty = "Ampere : " + strix;
ampere.Text = myStringProperty;
strix = "";
}
break;
case ":":
break;
case " ":
break;
case "\n":
break;
case "\r":
if (strix != "")
{
watt.Text = "Watt : " + strix;
strix = "";
wat = false;
}
break;
default:
if (amp)
{
strix += risposta.Substring(x,1);
}
if (wat)
{
strix += risposta.Substring(x,1);
}
break;
}
}

if (wat)
{
if (strix != "")
{
MyStringProperty = "Watt : " + strix;
watt.Text = myStringProperty;
strix = "";
wat = false;
}
}

}


Loop (stei è booleano):
while (stei)
{
risposta = bluDente.Spedisci("1002", false, Intestazione.Text, 1300);
Estrapola(risposta);
Thread.Sleep(1000);
}


NOTE: Il ciclo viene eseguito correttamente, i dati sono prelevati e decodificati senza problemi, ma i testi delle
label (ampere,watt) non sono aggiornati. Ho cercato sul web e provato varie soluzioni (timer, threading,..) senza
successo


DOMANDA: C'è qualcuno che sa come aggiornare i testi sulle label in uno scenario come questo ? (prelievo dati una volta al secondo all'interno di un ciclo while)


Grazie a tutti.
Fausto
843 messaggi dal 08 aprile 2009
Se gestisci il binding di una proprietà (in questo caso il text) non devi assegnare al nome dell'oggetto il testo.
Quindi non ti serve x:Name e non ti serve assegnare a watt.Text e ampere.Text.
OnPropertyChanged va modificato in OnPropertyChanged("MyStringProperty")

In più dovresti gestire i Task con una await quando richiami la funzione.

PS:quando immetti del codice nel post racchiudilo in code in modo tale che è più leggibile il testo. Tipo:

private string myProperty;

Modificato da laurar181 il 04 novembre 2021 11:16 -
2 messaggi dal 04 novembre 2021
Risolto !
Ho utilizzato
await
e
async
.
Ecco il pezzo di codice:
public async void CliccaBottone(object sender, EventArgs e)
.....
Task.Run(async () =>
                    {
                        while (stei)
                            await Device.InvokeOnMainThreadAsync(() =>
                            {
                                risposta = bluDente.Spedisci("1002", false, Intestazione.Text, 1300);
                                Estrapola(risposta);
                                Thread.Sleep(1000);
                                // ampere.Text = "xyz";
                            });
                         // }
                    });


Grazie a laurar181 per i suggerimenti.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.