В настоящее время я создаю приложение .NET MAUI и хочу, чтобы часть пользовательского интерфейса меняла текст метки при изменении логического значения в соответствующей модели представления.
<Label Text = "{x:Binding IsCorrect, Converter = {StaticResource IsCorrectToStringConverter}}"
TextColor = "{x:Binding IsCorrect, Converter = {StaticResource IsCorrectToTextColorConverter}}"
FontAttributes = "Bold"
VerticalOptions = "Center" />
А вот соответствующее IsCorrectToStringConverter
:
public class IsCorrectToStringConverter : IValueConverter
{
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
{
var isCorrect = (bool)value;
if (isCorrect)
{
return "Answer";
}
else
{
return "Wrong answer";
}
}
public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Вот код класса Answer
, включающего свойство IsCorrect
:
public class Answer
{
[Key]
public int AnswerId { get; set; }
public int QuestionId { get; set; }
public string Content { get; set; }
public bool IsCorrect { get; set; }
public int? Points { get; set; }
[NotMapped]
public bool IsSelected { get; set; }
}
Часть IsCorrectToTextColorConverter
— аналогичная задача с, вероятно, аналогичным решением.
Я попытался проверить, действительно ли поле IsCorrect
меняется, не вызывая изменений в пользовательском интерфейсе, что на самом деле так и есть. Следовательно, скорее всего, виноват преобразователь.
Кто-нибудь знает решение или источник этой проблемы?
«Следовательно, преобразователь, скорее всего, неисправен». На данный момент я не вижу никаких подтверждений этому. Я думаю, что это скорее объясняется отсутствием уведомления об изменении.
@JonSkeet Как можно уведомить об изменении в приложении?
Использование INotifyPropertyChanged
(так же, как в WPF). Теперь, когда вы предоставили класс Answer
, я совсем не удивлен, что он не работает — пользовательский интерфейс не может уведомить об изменении свойства. Дополнительную информацию см. на странице Learn.microsoft.com/en-us/dotnet/maui/xaml/fundamentals/mvvm.
Большое спасибо! Я ответил на свой вопрос, включая обновленный рабочий код.
@Jason: На самом деле это не обязательно должно быть ObservableProperty или вообще использовать набор инструментов сообщества. Это один из простых способов реализации INotifyPropertyChanged
, но это не единственный способ. (Я уверен, вы это уже знаете, я просто не хочу, чтобы у людей сложилось впечатление, что им нужно использовать ObservableProperty и т. д.)
Спасибо @JonSkeet и @Jason за простое решение. Пользовательский интерфейс не смог ответить, поскольку он не был должным образом уведомлен.
Решением было сделать свойство IsCorrect
наблюдаемым, создав класс Answer
и расширив его с помощью partial
. После этого свойство было отмечено знаком ObservableObject
, что решило проблему:
public partial class Answer : ObservableObject
{
[Key]
public int AnswerId { get; set; }
public int QuestionId { get; set; }
public string Content { get; set; }
[ObservableProperty]
private bool _isCorrect;
public int? Points { get; set; }
[NotMapped]
public bool IsSelected { get; set; }
}
Вы не показали нам свойство
IsCorrect
и то, генерирует ли оно какие-либо события. Сомневаюсь, что конвертер вообще актуален, если честно. Я настоятельно советую вам создать минимальный воспроизводимый пример, в котором не требуется никакого специального преобразования — посмотрите, сможете ли вы воспроизвести проблему таким образом, и включите весь соответствующий код ViewModel.