DataGridColumn 未在 PropertyChanged 上更新

DataGridColumn not updating on PropertyChanged

当 属性 更改时,我的 DataGrid 没有更新我的 ObservableCollection 中的值(它确实显示了初始值)。我查看了许多其他 SO 文章,但到目前为止没有发现我的问题。我正在使用以下 XAML

<DataGrid Name="downloadingGrid" IsReadOnly="True" AutoGenerateColumns="False" CanUserResizeRows="False">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Path=Title}" Header="Title" />
        <DataGridTextColumn Binding="{Binding Path=Size}" Header="Size" />
        <DataGridTextColumn Binding="{Binding Path=Done, Mode=OneWay, UpdateSourceTrigger=PropertyChanged,NotifyOnTargetUpdated=True}" Header="Done" />
        <DataGridTextColumn Binding="{Binding Path=Progress}" Header="Progress" />
    </DataGrid.Columns>
</DataGrid>

在我的代码中,我有 SongDownloading class,它实现了 INotifyPropertyChanged 接口,如下所示:

 private long done;
 public long done;
 public event PropertyChangedEventHandler PropertyChanged;

 public SongDownloading()
 {
     done = 0;
 }

 public long Done
 {
     get { return done; }
     set
     {
         done = value;
         OnPropertyChanged("Property Change");
     }
 }

 protected void OnPropertyChanged(String e)
 {
     PropertyChangedEventHandler handler = PropertyChanged;
     if (handler != null)
         handler(this, new PropertyChangedEventArgs(e));
 }

然后是我的主要 class:

public ObservableCollection<SongDownloading> downloading = new ObservableCollection<SongDownloading>();
private SongDownloading songToBeDownloaded;

public MainWindow() {
    InitializeComponent();
    downloadingGrid.ItemsSource = downloading;
}

public void test() {
    downloading.Add(new SongDownloading());
    songToBeDownloaded = downloading[0]; 
    System.Timers.Timer t = new System.Timers.Timer();
    t.Interval = 1000;
    t.Elapsed += new System.Timers.ElapsedEventHandler(changeValue);
    t.Start();
}

private void changeValue(object sender, ElapsedEventArgs e)
{
    songToBeDownloaded.Done += 1;
}

当然还有更多的代码,但这超出了问题的范围,因此被删除以提高可读性。

PropertyChanged 事件确实触发了,并且 songToBeDownloaded 的 Done 值确实发生了变化。我已经检查并仔细检查了。所以绑定到 DataGridColumn 有问题。我几乎浏览了所有相关的 SO 文章并尝试了所有方法,但它不起作用。这可能是某个地方的愚蠢错误,但我一辈子都弄不明白。

您应该将 属性 的名称(即 "Done")传递给 OnPropertyChanged 方法,而不是 string "Property Change" 中的值按预期刷新视图:

public long Done
{
    get { return done; }
    set
    {
        done = value;
        OnPropertyChanged("Done"); //<--
    }
}

如果您使用的是 C#6 / Visual Studio 2015,您可以使用 nameof 运算符:

OnPropertyChanged(nameof(Done));