Столбец UWP DataGrid привязан к двойному значению, допускающему значение NULL, но изменение ячейки не изменяет свойство

Ячейка в DataGrid правильно обновляется, если я изменяю значение свойства в коде, но значение свойства не изменяется, если я изменяю значение в самой ячейке. На самом деле, если я изменяю значение в ячейке, оно немедленно возвращается к значению, которое было установлено до этого.

Я работаю над приложением, в котором вы можете установить данные рейтинга телесериалов, и я использую эту сетку данных для этой цели. Вот соответствующий XAML:

<Grid >
        <Grid.RowDefinitions>
            <RowDefinition Height = "Auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>

        <TextBlock Text = "Edit Ratings" FontSize = "36" Margin = "10" TextAlignment = "Center"/>
        <controls:DataGrid ItemsSource = "{x:Bind NetworkRatings}" Margin = "10" AutoGenerateColumns = "False" FrozenColumnCount = "1" Grid.Row = "1">
            <controls:DataGrid.Columns>
                <controls:DataGridTextColumn Header = "Show Name" Binding = "{Binding ShowName}"/>
                <controls:DataGridTextColumn Header = "Episode 1" Binding = "{Binding Episode1, Mode=TwoWay, TargetNullValue='null', UpdateSourceTrigger=PropertyChanged}"/>
            </controls:DataGrid.Columns>
        </controls:DataGrid>
</Grid>

Я изменил TargetNullValue, чтобы сделать нулевые значения более очевидными во время тестирования приложения, но в итоге это будет пустая ячейка. Вот код для страницы:

public sealed partial class EditRatings : Page
    {
        ObservableCollection<RatingsContainer> NetworkRatings;
        Network network;

        public EditRatings()
        {
            this.InitializeComponent();
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            network = (Network)e.Parameter;

            NetworkRatings = network.NetworkRatings;
        }
    }

а вот класс RatingsContainer

class RatingsContainer : INotifyPropertyChanged
    {

        public string ShowName { get; } 

        List<double?> Ratings;             

        public double? Episode1
        {
            get
            {
                return Ratings[0];
            }
            set
            {
                Ratings[0] = value;
                OnPropertyChanged("Episode1");
            }
        }

        public RatingsContainer(Show s)
        {
            ShowName = s.name;

            Ratings = s.ratings;  //List of 26 double? values   

        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string name)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(name));
            }
        }
    }

Пока я работал только над одним эпизодом из 26. Изначально я просто хотел работать прямо со списком или с массивом, но я не мог понять, как сделать свойство notify для чего-то подобного, поэтому я решил чтобы в конце концов разделить их все на свои собственные свойства.

Таким образом, PropertyNotify, кажется, работает нормально, поскольку я могу обновить свойство из кода позади, и оно автоматически обновится с новым значением в сетке данных. Однако по какой-то причине изменение ячейки непосредственно в сетке данных вообще не вызывает запуска метода set для свойства. Я пропустил что-то супер очевидное здесь? Если я сделаю свойство ShowName устанавливаемым, оно изменится просто отлично. Если я сделаю свойство Episode1 обычным двойным значением, а не значением nullable double, оно также будет работать нормально, но мне нужно это нулевое значение для представления эпизодов, у которых еще нет оценок. Поскольку я начинаю с нулевого значения, когда я изменяю значение в ячейке и нажимаю на другую ячейку, оно немедленно возвращается к нулю. Если я начну со значения или программно установлю значение, оно автоматически переключится обратно на это значение после того, как я введу что-то еще.

Для справки: это мое первое приложение UWP, до этого много лет назад у меня был лишь ограниченный опыт работы с WPF. Меня не удивит, если я пропущу что-то очевидное, но я всю ночь гуглил эту проблему без особого успеха. Кажется, мою конкретную проблему либо трудно найти, либо она не очень распространена.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
0
133
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я понял. Я не знаю, почему это работает, а по-другому нет, но я решил создать преобразователь нулевых значений и использовать его в XAML вместо TargetNullValue. Кажется, проблема в том, что мой предыдущий метод работал в одну сторону, а не в две. TargetNullValue работал при чтении нулевых значений из свойства, но по какой-то причине он был совершенно неспособен сохранить любые данные, которые я ввел обратно в свойство, поэтому вместо этого использование преобразователя значений, похоже, решило эту проблему.

Если кто-нибудь знает, почему предыдущий метод не сработал, я все равно буду признателен за любые последующие комментарии по этому поводу.

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