使用backgroundworker更新datagrid WPF

使用backgroundworker更新datagrid WPF

问题描述:

datagrid在foreach循环中未更新。在下面的代码中,datagrid在线程完成后更新,但不在之间。因为我的foreach循环是另一个类。我知道,不知何故我必须实现BackgroundWorker.OnProgressChanged方法来更新进度,但无法弄清楚。使用backgroundworker更新datagrid WPF

XMAL FILE

<dg:DataGrid ItemsSource="{Binding}"> 
        <dg:DataGrid.Columns> 
        <dg:DataGridTextColumn Binding="{Binding grade, Mode=TwoWay, IsAsync=True}" Header="Status"/> 
        </dg:DataGrid.Columns> 
       </dg:DataGrid> 

GUI CLASS

public partial class GUIClass : Page 
      { 
       BackgroundWorker bgWorker = new BackgroundWorker(); 
       public GUIClass() 
       { 
        InitializeComponent(); 
        bgWorker.WorkerSupportsCancellation = true; 
        bgWorker.WorkerReportsProgress = true; 
       } 

       private void btnOK_Click(object sender, RoutedEventArgs e) 
       { 
        bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork); 
        bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgressChanged); 
        bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted); 
        bgWorker.RunWorkerAsync(); 
       } 

       void bgWorker_DoWork(object sender, DoWorkEventArgs e) 
       { 
        ClassA cls= new ClassA(); 
        cls.runprocess(); 
       } 

      void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
      { 
        dataGrid1.Items.Refresh(); 
      } 

      void bgWorker_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e) 
       { 
        .... 
        ..... 
        dataGrid1.Items.Refresh(); 
       } 

    } 

数据网格绑定

public class BindClass 
{ 
     public bool staus{ set; get; } 
     public string grade{ set; get; } 
} 

ClassA的

class ClassA 
{ 
    public void runprocess() 
    { 
      foreach (var item in IEnumerable<BindClass>) 
      { 
      if(somecondition) 
      { 
        // I want to update datagrid at this stage so user can see it 
        item.grade="First" 
      } 
      } 
    } 
} 

为了在更改类的'grade'属性时更新数据网格,它需要实现INotifyPropertyChanged。尝试更新类,如下所示:

public class BindClass : INotifyPropertyChanged 
{ 
private string _grade; 

public string Grade 
{ 
    get { return _grade; } 
    set 
    { 
    if (_grade == value) 
     return; 

    _grade = value; 
    OnPropertyChanged("Grade"); 
    } 
} 

public event PropertyChangedEventHandler PropertyChanged; 

protected void OnPropertyChanged(string property) 
{ 
    if (PropertyChanged!=null) 
    { 
    PropertyChanged(this, new PropertyChangedEventArgs(property)); 
    } 
} 
} 

注意 - 我已经从“品位”到“级”更改属性的名称遵循.NET约定。我相信你可以添加状态属性自己的执行;-)

我会去一个解决方案,DataGrid的ItemsSource时是ObservableCollection,使事情变得更容易,而且我认为你可以做到这一点,你的情况从你写的是什么。

这样你就不必去执行INotifyPropertyChanged的事件处理程序

的麻烦(注:ObservableCollections修改更新UI,而其他集合类型不)。这是MS建议在dataGrid的文档中做的事情(虽然我不能把我的手放在我读过的文档的位上)