#c# #xamarin.forms
Вопрос:
У меня есть такой ярлык:
<Label x:Name="QuestionText" FontSize="62" Text="{Binding question}" HorizontalTextAlignment="Center" Padding="0,20,0,0" />
Это внутри карусели:
<CarouselView
x:Name="Questions"
HeightRequest="475">
<CarouselView.ItemTemplate>
<DataTemplate>
<StackLayout HorizontalOptions="Center" Padding="10">
<Label x:Name="QuestionText" FontSize="62" Text="{Binding question}" HorizontalTextAlignment="Center" Padding="0,20,0,0" />
</StackLayout>
</DataTemplate>
</CarouselView.ItemTemplate>
</CarouselView>
И я заполняю карусель таким образом:
protected override async void OnAppearing()
{
base.OnAppearing();
questions = await webService.GetTaskQuestions(taskcategory);
List<QuestionsClass> currentPage = new List<QuestionsClass>();
currentPage.Add(questions[currentPageIndex]);
Questions.ItemsSource = currentPage;
}
И я пытаюсь обновить свой текст вот так:
questions[currentPageIndex].question = questions[currentPageIndex].question.Replace("_", questions[currentPageIndex].answer);
Я даже пытался:
Device.BeginInvokeOnMainThread(() =>
{
questions[currentPageIndex].question = questions[currentPageIndex].question.Replace("_", questions[currentPageIndex].answer);
});
И все равно ничего, вот мой класс:
public class QuestionsClass
{
public string question { get; set; }
public string answer { get; set; }
}
Как обновить метку внутри карусели?
Обновить
Я пробовал с INotifyPropertyChanged:
public class QuestionsClass : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public string question { get; set; }
public string actualQuestion
{
get
{
return question;
}
set
{
question = value;
OnPropertyChanged();
}
}
public string answer { get; set; }
protected void OnPropertyChanged([CallerMemberName] string quetion = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(question));
}
}
Вот мой лейбл:
<Label FontSize="62" Text="{Binding actualQuestion}" HorizontalTextAlignment="Center" Padding="0,20,0,0" />
и вот как я его обновляю:
questions[currentPageIndex].question = questions[currentPageIndex].question.Replace("_", questions[currentPageIndex].answer);
Обновить
Мой класс был неправильным, это правильный класс, и сейчас он работает:
public class QuestionsClass : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string _question;
public string question {
get
{
return _question;
}
set
{
_question = value;
NotifyPropertyChanged("question");
}
}
public string answer { get; set; }
private void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Комментарии:
1. Вы обновляете переменную вопросов (в нижнем регистре). Почему бы вам не попробовать обновить вопросы. CurrentItem (вид карусели). Также я рекомендую вам изменить название карусели, чтобы лучше их отличать
2. Кроме того, я бы рекомендовал создать коллекцию ObservableCollection<QuestionsClass> и привязать свой carrouselview непосредственно к этому
3. если вы пытаетесь динамически обновлять пользовательский интерфейс,
QuestionsClass
необходимо реализоватьINotifyPropertyChanged
4. @Jason как мне применить это к своему классу, я видел примеры, но это очень запутанно
5. существует 10 000 существующих примеров, и мне нет смысла писать для вас еще один. Здесь показано все, что вам нужно сделать, на одной странице: docs.microsoft.com/en-us/dotnet/desktop/wpf/data/…