![](/img/trans.png)
[英]WPF - Datagrid Binding: INotifyPropertyChanged and BackgroundWorker no UI-Update
[英]Update datagrid WPF using backgroundworker
datagrid在foreach循環中未更新。 在下面的代碼中,一旦線程完成,datagrid就會更新,但不會在兩者之間更新。 由於我的foreach循環是另一類。 我知道我必須以某種方式要求BackgroundWorker.OnProgressChanged方法更新進度,但無法弄清楚。
XMAL文件
<dg:DataGrid ItemsSource="{Binding}">
<dg:DataGrid.Columns>
<dg:DataGridTextColumn Binding="{Binding grade, Mode=TwoWay, IsAsync=True}" Header="Status"/>
</dg:DataGrid.Columns>
</dg:DataGrid>
GUI類
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"
}
}
}
}
為了在更改類的“ 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屬性的實現;-)
我將尋求一個解決方案,其中dataGrid的ItemsSource是一個ObservableCollection
,使事情變得更容易,並且我認為您可以根據自己的情況來編寫。
這樣,您就不必麻煩實現INotifyPropertyChanged事件處理程序
(注意:ObservableCollections修改會更新UI,而其他Collection類型則不會)。 這是MS建議在dataGrid的文檔中執行的操作(盡管我不能把手放在我讀過的文檔上)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.