0

我正在尝试在我的 WPF 应用程序中绑定一些控件BindingListComboBox但是,MyBindingList是从 UI 线程以外的其他线程更新的。

我做了一个模型。您所需要的只是新的空项目,其中包含对 WindowsBase、PresentationCore、PresentationFramework、System.Xaml 的引用(或者只是将其放入预定义的 WPF 窗口中)。

using System;
using System.ComponentModel;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

public class MainWindow : Window
{
    [STAThread]
    public static void Main()
    {
        new MainWindow().ShowDialog();
    }

    public MainWindow()
    {
        BindingList<string> list = new BindingList<string>();
        ComboBox cb = new ComboBox();
        cb.SetBinding(ComboBox.ItemsSourceProperty, new Binding() { Source = list });
        this.Content = cb;
        list.Add("Goop");
        new Thread(() =>
        {
            list.Add("Zoop");
        }).Start();
    }
}

在行中Goop,一切正常。但是,当它到达这Zoop条线时,它会抛出一个异常:

这种类型的 CollectionView 不支持从不同于 Dispatcher 线程的线程更改其 SourceCollection。

在实际项目中,我无法将其list.Add移至 UI 线程,并且我想保留 Binding 问题。如何解决?我可以转移到其他“列表”而不是BindingList. 我尝试过简单List<string>但更糟糕的是:当我添加新项目时它根本不会更新。

编辑

实际上,添加线程知道列表,但不知道 WPF 窗口。该列表在具有内部工作的类中,GUI 检查并查看该类。所以,不Add应该知道GUI。

4

2 回答 2

0

UI 线程被锁定。然后你必须在一个特殊的函数中给它你的数据。 MSDN 开始调用

通过使用 :

BeginInvok(()=>{ // Your stuff});

您将要求 UI 尽快更新您的视图。

于 2012-08-06T11:56:19.717 回答
0

试试这个 ,

  new Thread(() =>
  {
      if (cb.Dispatcher.CheckAccess())
        {
           list.Add("Zoop");
        }
      else
       {
        cb.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal,
                new Action(delegate 
                         {
                           list.Add("Zoop");
                         }
       ));
       }
  }).Start();

希望这可以帮助

于 2012-08-06T12:04:47.053 回答