web-dev-qa-db-ja.com

Xamarinでラベルテキストを変更する方法

Xamarinフォームは比較的新しいです。背後のコードからラベルテキストを変更できないことがわかりました。通常、私はmyLabel.text = variable。これはXamarinで機能しますか?もしそうなら、このコードはテキストを変更しないのですか?

Label_ControlSW.Text = controlSW_Out;
            Label_BLESW.Text = bleSW_Out;
            Label_Mode.Text = mode_Out;

XAMLファイル

<Label x:Name="Label_ControlSW" Grid.Row="1" Grid.Column="1" HorizontalOptions="Center"  VerticalOptions="Center" FontSize="17" TextColor="White"/>
                <Label x:Name="Label_BLESW" Grid.Row="2" Grid.Column="1" HorizontalOptions="Center"  VerticalOptions="Center" FontSize="17" TextColor="#525252"/>
                <Label x:Name="Label_Mode"  Grid.Row="4" Grid.Column="1" HorizontalOptions="Center"  VerticalOptions="Center" FontSize="17" TextColor="White"/>
5
Bleari

これはXamarinで機能しますか?

はい、そうです。

もしそうなら、なぜこのコードはテキストを変更しないのですか?

Labelコンポーネントは変数にバインドされていないため、これ以上Label_ControlSW.Text = controlSW_Out; eを実行したときに値を取得するだけです。

これを機能させるには、基本的に2つの選択肢があります。

1。変更のたびに値をラベルに設定します

ここには魔法はありません。 ALi Heikalが彼の答えで示唆するように、値または変数を設定するだけです

2。ページ(ビュー)を監視可能なオブジェクトにバインドすると、ビューは監視可能なオブジェクト(多くの場合、ビューモデル)のすべての変更をリッスンし、これに反応します(それ自体のテキスト値の変更、例)。

あなたがやろうとしているのは2番目のものだと思います。そのため、ページのコードビハインドでパブリック文字列の完全なプロパティを作成し、ページのインスタンスをそれ自体にバインドできます。このような:

[〜#〜] xaml [〜#〜]

<Label Text={Binding MyStringProperty}
       .../>

コードビハインド

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

    public MyTestPage()
    {
        InitializeComponents();
        BindingContext = this;

        MyTextProperty = "New label text"; // It will be shown at your label
    }
}

XFでのデータバインディングとMVVMパターンに関する 公式ドキュメントをご覧ください Xamarin.Formsから始める場合は、各トピックに対応する 公式のスタートガイド に従うことを強くお勧めします必要なすべてを学ぶのに十分なほど明確で深い。

お役に立てば幸いです。

2

次のようにXAMLでText値を初期化してみてください。

<Label x:Name="YourLableName" Text="Initial Label"/>

次に、次のようにコードビハインドでアクセスします。

YourLableName.Text = "Desired Name";

または

YourLableName.Text = variable;
2
Ali Heikal

UIを更新するには、UIスレッドを使用する必要があります。あなたは次のようなことをしたいでしょう:

 Device.BeginInvokeOnMainThread(() =>
 {
     Label_ControlSW.Text = controlSW_Out;
     Label_BLESW.Text     = bleSW_Out;
     Label_Mode.Text      = mode_Out;
 });

これで問題は解決しますが、他の回答で述べたように、Xamarinがこれを行う方法は、ビューを更新するために data binding を使用することです。データバインディングはUIの更新を処理します。

0
Andrew

これが機能しない理由はいくつかあります。 MVVMアプローチに変更しました。これはまだ効果がありませんでしたが、提案されたように、より良いアプローチでした。デバッグしているときに、次の行に気づきました:I/Choreographer(16942):31フレームをスキップしました!アプリケーションがメインスレッドで実行している作業が多すぎる可能性があります。これは、メインスレッド(接続不良)を過度に実行していて、UIの変更をスキップしていたためです。異なるスレッドでより多くを実行するには、コードを再構築する必要がありました。みんな助けてくれてありがとう。

0
Bleari

私は同じ問題に直面しました。ビューフォルダーでx:Name参照を作成したら、クリーンアンドビルドプロジェクトを試してください。または、Databindingを実行できます。このコードを使用して

 <Label Text="{Binding MyProperty}" />

Xaml。そしてViewModelクラス

public class MyViewModel
{
    public string MyProperty { get; set; } = "My Label Text";
}

そして、背後にあるコードでViewModelの使用について言及するだけです

this.BindingContext = new MyViewModel();

これが正しいアプローチです。今後のコーディングでは[〜#〜] mvvm [〜#〜]アプローチを使用してみてください。これは正しいアプローチであるためです。

0
Judson Abraham