如何刷新WPF应用程序中另一个类的列表框项?

时间:2015-12-06 15:47:44

标签: c# .net wpf xaml listbox

我正在制作一个下载程序。在我的项目中有一个名为main.xaml.cs和downloader.cs的主窗口和下载器类。

主窗口中有一个自定义ListBox。我试图从downloader.cs刷新列表框项,但是应用程序给出了运行时错误。

downloader.cs中的代码:

namespace MyDownloaderApp
{
    class downloader
    {
        /*
        ...
        */

        private void doWork()
        {
            ((MainWindow)System.Windows.Application.Current.MainWindow).myListBox.Items.Refresh();
        }
    }
}

我收到以下错误:

类型' System.InvalidOperationException'的例外情况发生在WindowsBase.dll中但未在用户代码中处理:    "调用线程无法访问此对象,因为另一个线程拥有它。"

然后我尝试了类似下面代码的事件处理程序,但我得到了同样的错误。

downloader.cs:

namespace MyDownloaderApp
{
    class downloader
    {

        public event EventHandler _myEventHandler;

        /*
        ...
        */

        private void doWork()
        {
            this._myEventHandler(this, new EventArgs());
        }

    }
}

main.xaml.cs:

namespace MyDownloaderApp
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            private FileDownloader downloader = new FileDownloader();

            public MainWindow()
            {
                InitializeComponent();

                downloader._myEventHandler += myEventHandler;
            }

            /*
            ...
            */

            private void myEventHandler(object sender, EventArgs e)
            {
                myListBox.Items.Refresh();
            }

        }
    }

我该怎么办才能修复它?

1 个答案:

答案 0 :(得分:2)

您应该使用:

this.Dispatcher.Invoke((Action)(() =>
    {
        ...// your code refresh listbox Items
    }));

请查看:The calling thread cannot access this object because a different thread owns it