当属性发生更改时,我的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类,它实现了这样的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));
}
然后是我的主要课程:
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的完成值确实发生了变化。我检查过并仔细检查过。所以绑定到DataGridColumn有问题。我已经查阅了几乎所有相关的SO文章并尝试了所有内容,但它不起作用。可能它在某个地方是一个愚蠢的错误,但我无法弄清楚我的生活。
答案 0 :(得分:0)
您应该将属性的名称(即“完成”)传递给OnPropertyChanged
方法,而不是string
“属性更改”,以便视图中的值按预期进行刷新:< / p>
public long Done
{
get { return done; }
set
{
done = value;
OnPropertyChanged("Done"); //<--
}
}
如果您正在使用C#6 / Visual Studio 2015,则可以使用nameof
运算符:
OnPropertyChanged(nameof(Done));