2017-01-20 28 views
1

昨夜、Xamarinフォームでラベル値を更新する方法を試すのに5時間を費やしましたが、どこにも行きませんでした。Xamarinフォーム - ラベル値を更新する

私のXAMLは次のようになります。

<?xml version="1.0" encoding="UTF-8"?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Meditation.HomePage"> 
<ContentPage.Content> 
    <Button Text="{Binding SelectedSound}" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" Clicked="OnButtonClicked" /> 
</ContentPage.Content> 

私のメインページクラスは次のようになります。

using System; 
using System.Collections.Generic; 
using Xamarin.Forms; 

namespace Meditation 
{ 
public partial class HomePage : ContentPage 
{ 
    public String SelectedSound { get; set; } 

    public HomePage() 
    { 
     InitializeComponent(); 

     this.Title = AppInfo.AppName; 
    } 

    protected override void OnAppearing() 
    { 
     ShowSelectedSound(); 
     BindingContext = this; 
    } 

    protected override void OnDisappearing() 
    { 
     DependencyService.Get<IAudio>().StopAudio(); 
    } 

    // User Actions 

    void OnButtonClicked(object sender, EventArgs args) 
    { 
     Navigation.PushAsync(new SoundSelectionPage()); 
    } 

    // Private 

    private void ShowSelectedSound() 
    { 
     if (Application.Current.Properties.ContainsKey(AppInfo.keySoundSelected)) 
     { 
      SelectedSound = Application.Current.Properties[AppInfo.keySoundSelected] as string; 
     }          

     else 
     { 
      this.SelectedSound = "Choose sound"; 
     } 
    } 
} 
} 

ボタンが正しくページ「選択した音のようなテキストを示してい最初の負荷。しかし、このページに戻ると、application.current.propertiesキー値が存在するときにテキストを更新できません。

誰かが、ページが最初に読み込まれていて進行中でないときに、そのラベルが更新されるように見える理由を知っています。さらに重要なのは、ボタンテキストを最初に設定した後に更新するコードを誰でも提供できることですか?

+0

あなたは 'SelectSoundButtonText'にバインドしていますが、プロパティ名は' SelectedSound'です。それは誰ですか? – esiprogrammer

+0

申し訳ありません。それはタイプミス(問題の更新)でした。問題はまだ顕著です。ページが最初にロードされると、テキストが表示されますが、その後は更新されません。 –

答えて

2

homepageクラスにINotifyPropertyChangedを実装して、ページを更新する必要があります。

public partial class HomePage : ContentPage, INotifyPropertyChanged 
{ 

     private string selectedSound; 
     public string SelectedSound 
     { 
      get 
      { 
       return selectedSound; 
      } set 
      { 
       if (selectedSound!=value) 
       { 
        selectedSound = value; 
        this.OnPropertyChanged("SelectedSound"); 
       } 
      } 
     } 

    ..... 

public event PropertyChangedEventHandler PropertyChanged; 
protected virtual void OnPropertyChanged(string propertyName){ 
     if (PropertyChanged != null { 
      PropertyChanged(this, 
       new PropertyChangedEventArgs(propertyName));}} 

} 

が、私はMVVM patternを実装し、代わりにViewModelを定義することをお勧めします。

+0

xamlのボタンの 'x:Name'プロパティを設定しようとしました。その後、私のコードでボタンオブジェクトを取得するために、その名前をそのコードで参照しました。その後、TextChangedコードを必要とせずに、テキスト値を更新し、それがすべて機能しました。それは有効な選択肢ですか? –

+1

コードビハインドを使用してオブジェクトをいつでも変更できます。 x:nameはフィールドを生成し、コードの背後でそれを使うことができます。それは実装のためのスマートな方法ではありません。私が言ったように、データバインディングinstedを使用することを強く推奨します。 'MVVM'のようなパターンを使うのはプラスです – esiprogrammer

+0

ああ。 MVVMはなぜ優れていますか? –

関連する問題