#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:
Ответ
Здесь нарушены две вещи:
- Вы повторно инициализируете свою ViewModel вместо ссылки на тот же экземпляр
- Вы передаете неправильное значение в
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 увеличивалось каждый раз, когда пользователь давал правильный ответ, значение сохранялось в счете.