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));
当 属性 更改时,我的 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));