DataGridColumn未在PropertyChanged上更新

时间:2017-02-08 22:32:12

标签: c# wpf xaml datagrid 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类,它实现了这样的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文章并尝试了所有内容,但它不起作用。可能它在某个地方是一个愚蠢的错误,但我无法弄清楚我的生活。

1 个答案:

答案 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));