Обновление сетки данных WPF с использованием backgroundworker - PullRequest
0 голосов
/ 01 февраля 2011

датагрид не обновляется в цикле foreach.В приведенном ниже коде datagrid обновляется после завершения потока, но не между.Поскольку мой цикл foreach - другой класс.Я знаю, что каким-то образом мне нужно реализовать BackgroundWorker.OnProgressChanged Method, чтобы обновить прогресс, но не могу понять.

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();
              }

    }

Класс привязки DataGrid

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"
             }  
          }
    }
}

Ответы [ 2 ]

3 голосов
/ 01 февраля 2011

Чтобы сетка данных обновлялась при изменении свойства '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));
   }
 }
}

Примечание. Я изменил имя свойства с 'grade' на 'Grade', чтобы следовать соглашениям .NET. Я уверен, что вы можете добавить реализацию свойства status самостоятельно; -)

1 голос
/ 01 февраля 2011

Я бы выбрал решение, в котором DataSrid ItemsSource равен ObservableCollection, что упрощает работу, и я думаю, что вы могли бы сделать это в своем случае из того, что написали.

Таким образом, вам не нужно заниматься реализацией обработчиков событий INotifyPropertyChanged

(примечание: изменения ObservableCollections обновляют пользовательский интерфейс, в то время как другие типы коллекций этого не делают). Это то, что MS советует делать в документе dataGrid (хотя я не могу приложить руку к тому документу, который я прочитал и который говорит это)

...