Aktualisieren der Benutzeroberfläche mit BackgroundWorker in WPF

Momentan schreibe ich eine einfache WPF 3.5-Anwendung, die die SharePoint-COM verwendet, um SharePoint-Websites aufzurufen und Gruppen- und Benutzerinformationen zu generieren. Da dieser Vorgang eine Weile dauert, möchte ich eine Fortschrittsleiste anzeigen, während die Gruppen generiert werden. Der gewünschte Prozess ist wie folgt:

Der Benutzer gibt die URL ein und klickt auf die Schaltfläche, um die Site-Daten abzurufen.ProgressBar startet die AnimationGruppen werden generiert und Namen zu einer ListView hinzugefügtNach Abschluss wird die ProgressBar-Animation beendet

Das Problem, auf das ich stoße, ist, dass die Benutzeroberfläche niemals aktualisiert wird. Weder die Fortschrittsleiste noch die Listenansicht nehmen Änderungen vor. Wenn jemand Ideen hat, um mit dem unten stehenden Code zu helfen, wäre er sehr dankbar.

private void GetGroupsAndUsersButton_Click(object sender, RoutedEventArgs e)
{
    siteUrl = "";

    if (SiteURLTextBox.Text.Length > 0)
    {
        FetchDataProgressBar.IsIndeterminate = true;

        mWorker = new BackgroundWorker();
        mWorker.DoWork += new DoWorkEventHandler(worker_DoWork);
        mWorker.WorkerSupportsCancellation = true;
        mWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
        mWorker.RunWorkerAsync();
    }
    else
    {
        System.Windows.MessageBox.Show("Please enter a URL for the SharePoint site you wish to retrieve data");
    }
}

private void worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
    siteUrl = SiteURLTextBox.Text;
    GroupListView.ItemsSource = null;

    try
    {
        using (SPSite site = new SPSite(siteUrl))
        {
            SPWeb web = site.OpenWeb();
            SPGroupCollection collGroups = web.SiteGroups;
            if (GroupNames == null)
                GroupNames = new List<string>();

            foreach (SPGroup oGroup in collGroups)
            {
                GroupListView.Items.Add(new ListViewItem() { Content = oGroup.Name });
            }

            foreach (ListViewItem item in GroupListView.Items)
            {
                item.MouseLeftButtonUp += item_MouseLeftButtonUp;
            }
        }
    }
    catch (Exception ex)
    {
        System.Windows.MessageBox.Show("Unable to locate a SharePoint site at: " + siteUrl);
    }
}

private void worker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
    FetchDataProgressBar.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal,
    new Action(
        delegate()
        {
            FetchDataProgressBar.IsIndeterminate = false;
        }
        ));
}

Antworten auf die Frage(3)

Ihre Antwort auf die Frage