1

タイトルはほとんどそれをすべて言います。スコアは 0 として表示されています (これは私が初期化したものです)。ただし、スコアを更新すると、UI textBlock に反映されません。これは非常に簡単だと思いましたが、Android からの切り替えで常に問題が発生しています :) UI スレッドで何かを実行していると思いますか??

「スコア」プロパティにバインドしようとしています。

<TextBox x:Name="text_Score" Text="{Binding Score, Mode=OneWay}" HorizontalAlignment="Left" Margin="91,333,0,0" Grid.Row="1" TextWrapping="Wrap" VerticalAlignment="Top" Height="148" Width="155" FontSize="72"/>

ここに私のホルダークラスがあります

   public class GameInfo
    {
        public int Score { get; set; }
        public int counter = 0;
    }

**注: {get; を忘れずに追加してください。set;} でないと何も表示されません。

そして、これは私がそれを設定しようとしている場所です

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    info.counter = (int)e.Parameter;

    text_Score.DataContext = info;
}

PS 繰り返しますが、私は OneWay を使用します。スコアのみを表示し、変数が変更されたときに日付を付けないようにしたい。ユーザー入力を無効にする予定です。

これが完全に機能するコード例です。変更しなければならなかったのは、ホルダー クラスだけでした。ありがとうウォルト。

public class GameInfo : INotifyPropertyChanged
{
    private int score;
    public int Score {
        get { return score; }
        set
        {
            if (Score == value) return;
            score = value;
            NotifyPropertyChanged("Score");
        }
    }
    public int counter = 0;

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
4

1 に答える 1

2

XAML バインディングでは、基になるクラスは、値が変更されたことをバインディング フレームワークに通知する必要があります。あなたの例では、OnNavigatedTo イベント ハンドラーでカウンターを設定しています。しかし、GameInfo クラスを見ると、これは単純なデータ オブジェクトです。

INotifyPropertyChanged インターフェイスは、プロパティ値が変更されたことをクライアント (通常はバインディング クライアント) に通知するために使用されます。したがって、あなたの場合、次のようにクラスを変更します

public class GameInfo : INotifyPropertyChanged
{
    private int _score;
public int Score
{
  get
  {
    return this._score;
  }

  set
  {
    if (value != this._score)
  {
    this._score = value;
    NotifyPropertyChanged("Score");
  }
}

  }    
public int counter = 0; // if you use _score, then you don't need this variable.
    public event PropertyChangedEventHandler PropertyChanged;

     private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

}

詳細については、MSDN の記事を参照してください

于 2012-10-17T22:38:00.280 に答える