Aktualizowanie interfejsu użytkownika za pomocą BackgroundWorker w WPF

Obecnie piszę prostą aplikację WPF 3.5, która wykorzystuje SharePoint COM do wykonywania połączeń z witrynami SharePoint i generowania informacji o grupach i użytkownikach. Ponieważ proces ten trwa chwilę, chcę pokazać pasek postępu podczas generowania grup. Pożądany proces jest następujący:

Użytkownik wprowadza adres URL i przycisk kliknięcia, aby pobrać dane witryny.ProgressBar rozpoczyna animacjęGrupy są generowane, a nazwy są dodawane do ListViewPo zakończeniu animacja ProgressBar się kończy

Problem, w którym się znajduję, polega na tym, że interfejs użytkownika nigdy nie jest aktualizowany. Ani ProgressBar ani ListView nie wprowadza żadnych zmian. Jeśli ktoś ma jakieś pomysły na pomoc z poniższym kodem, byłby bardzo mile widziany.

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

questionAnswers(3)

yourAnswerToTheQuestion