【发布时间】:2019-07-23 13:42:55
【问题描述】:
如果我更改代码中的属性值,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 集中的一集。我最初只是想直接处理列表或数组,但我不知道如何对类似的东西执行 propertynotify所以我决定最终将它们全部分离到它们自己的属性中。
所以 PropertyNotify 似乎工作正常,因为我可以从后面的代码更新属性,它会自动刷新数据网格上的新值。但是,由于某种原因,直接在数据网格中修改单元格似乎根本不会触发属性的 set 方法。我在这里错过了一些非常明显的东西吗?如果我将 ShowName 属性设置为可设置,那修改就好了。如果我将 Episode1 属性设置为常规双精度而不是可空双精度,它也可以正常工作,但我需要该空值来表示还没有评级的剧集。当我从一个空值开始时,当我更改单元格中的值并单击另一个单元格时,它立即返回为空。如果我从一个值开始,或者以编程方式设置一个值,那么在我输入其他内容后它会自动切换回该值。
作为参考,这是我的第一个 UWP 应用,在此之前,我在多年前使用 WPF 的经验有限。如果我错过了一些明显的东西,我不会感到惊讶,但我整晚都在谷歌上搜索这个问题,但没有取得多大成功。看来我的具体问题要么很难找到,要么不太常见。
【问题讨论】:
标签: c# xaml data-binding uwp datagrid