Ячейка в 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. Меня не удивит, если я пропущу что-то очевидное, но я всю ночь гуглил эту проблему без особого успеха. Кажется, мою конкретную проблему либо трудно найти, либо она не очень распространена.





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