Xaramin form -вызывающая переменная из другого файла .cs

#xamarin.forms #data-binding

#xamarin.forms #привязка данных

Вопрос:

Я играю в викторину в Xaramin. формы. и для функции оценки. если пользователь получил правильный ответ, я хочу, чтобы оценка добавила 1. но в моем случае даже при правильном ответе оценка не добавляется.

Я также пытаюсь привязать переменную «оценка» к метке. Я хочу знать, ввел ли я правильный код или нет.

Кнопка

 private void submit_Clicked(object sender, EventArgs e)
{
    string answer = this.answer.Text;
    string canswer = "correct";

    if (answer != null)
    {
        string ranswer = answer.Replace(" ", string.Empty);

        if (ranswer.ToLower() == canswer)
        {
            DisplayAlert("GoodJob", "You got the correct answer", "OK");
            bindingModel b = new bindingModel();
            b.score  ;
          
            (sender as Button).IsEnabled = false;
        }
        else 
        {
            DisplayAlert("Unfortunately", "Your answer is wrong", "OK");
            (sender as Button).IsEnabled = false;
        }
    }
}
 

ViewModel

 
public class bindingModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public int displayScore => Score;
    public int score = 0;

    void OnPropertyChanged(int score)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(score.ToString()));
    }

    public int Score
    {
        get => score;
        set
        {
            if (score != value)
            {
                score = value;
                OnPropertyChanged(score);
            }
        }
    } 
}

 

Модель

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

Комментарии:

1. вы submit_Clicked создаете новый экземпляр bindingModel вместо экземпляра, который уже существует на странице

2. @Jason спасибо за ответ, могу я спросить, как правильно использовать существующий экземпляр. я новичок в программировании

Ответ №1:

в конструкторе страницы сохраните ссылку на свою виртуальную машину

 bindingModel VM;

// this is your constructor, the name will match your page name
public MyPage()
{
  InitializeComponent();

  this.BindingContext = VM = new bindingModel();

  ...
}
 

тогда в вашем обработчике событий вам НЕ нужно создавать новый bindingModel

 // update the Count on the VM
VM.Count  ;
 

Ответ №2:

Ответ

Здесь нарушены две вещи:

  1. Вы повторно инициализируете свою ViewModel вместо ссылки на тот же экземпляр
  2. Вы передаете неправильное значение в PropertyChangedEventArgs

1. Ссылка на модель представления

Вы повторно инициализируете ViewModel каждый раз, вызывая bindingModel b = new bindingModel();

Давайте инициализируем ViewModel один раз, сохраним его как поле, установим его как BindingContext for our ContentPage и свяжемся с этим полем в submit_Clicked

 
public partial class QuizPage : ContentPage
{
    readonly bindingModel _bindingModel;

    public QuizPage()
    {
        _bindingModel = new bindingModel();
        BindingContext = _bindingModel;
    }

    private async void submit_Clicked(object sender, EventArgs e)
    {
        string answer = this.answer.Text;
        string canswer = "correct";

        Button button = (Button)sender;
    
        if (answer != null)
        {
            string ranswer = answer.Replace(" ", string.Empty);
    
            if (ranswer.ToLower() == canswer)
            {
                await DisplayAlert("GoodJob", "You got the correct answer", "OK");
                _bindingModel.score  ;
    
                button.IsEnabled = false;
            }
            else 
            {
                await DisplayAlert("Unfortunately", "Your answer is wrong", "OK");
                button.IsEnabled = false;
            }
        }
    }
}
 

2. PropertyChangedEventArgs

Вам нужно передать имя свойства в PropertyChangedEventArgs .

Их способ PropertyChanged работы заключается в том, что он объявляет имя измененного свойства. В этом случае необходимо сообщить, что Score свойство изменилось.

Давайте используем nameof(Score) для передачи строки в "Score" PropertyChangedEventArgs :

 void OnScorePropertyChanged()
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(displayScore)));
}

public int Score
{
    get => score;
    set
    {
        if (score != value)
        {
            score = value;
            OnScorePropertyChanged();
        }
    }
} 
 

Комментарии:

1. Спасибо за ваш ответ. Я хочу спросить, как я могу сохранить значение в переменной? поскольку у меня около 10 вопросов и по каждому вопросу мне нужно увеличить переменную, если пользователь даст правильный ответ.

2. @JUSTINCHUA Значение score увеличивалось каждый раз, когда пользователь давал правильный ответ, значение сохранялось в счете.