Конвертер .NET MAUI не реагирует/конвертируется после изменения значения

В настоящее время я создаю приложение .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 меняется, не вызывая изменений в пользовательском интерфейсе, что на самом деле так и есть. Следовательно, скорее всего, виноват преобразователь.

Кто-нибудь знает решение или источник этой проблемы?

Вы не показали нам свойство IsCorrect и то, генерирует ли оно какие-либо события. Сомневаюсь, что конвертер вообще актуален, если честно. Я настоятельно советую вам создать минимальный воспроизводимый пример, в котором не требуется никакого специального преобразования — посмотрите, сможете ли вы воспроизвести проблему таким образом, и включите весь соответствующий код ViewModel.

Jon Skeet 16.04.2024 16:42

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

Jon Skeet 16.04.2024 16:43

@JonSkeet Как можно уведомить об изменении в приложении?

user23526969 16.04.2024 16:51

Использование INotifyPropertyChanged (так же, как в WPF). Теперь, когда вы предоставили класс Answer, я совсем не удивлен, что он не работает — пользовательский интерфейс не может уведомить об изменении свойства. Дополнительную информацию см. на странице Learn.microsoft.com/en-us/dotnet/maui/xaml/fundamentals/mvvm.

Jon Skeet 16.04.2024 16:55
IsConverter должен быть Заметным
Jason 16.04.2024 17:00

Большое спасибо! Я ответил на свой вопрос, включая обновленный рабочий код.

user23526969 16.04.2024 17:21

@Jason: На самом деле это не обязательно должно быть ObservableProperty или вообще использовать набор инструментов сообщества. Это один из простых способов реализации INotifyPropertyChanged, но это не единственный способ. (Я уверен, вы это уже знаете, я просто не хочу, чтобы у людей сложилось впечатление, что им нужно использовать ObservableProperty и т. д.)

Jon Skeet 19.04.2024 16:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
165
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Спасибо @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; }
}

Другие вопросы по теме