0

WPF アプリでコントロールするためにいくつかBindingListをバインドしようとしています。ComboBoxただし、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、すべてがOKです。ただし、Zoop行に到達すると、例外がスローされます。

このタイプの CollectionView は、Dispatcher スレッドとは異なるスレッドからの SourceCollection への変更をサポートしていません。

実際のプロジェクトではlist.Add、UI スレッドに移動できず、Binding の問題を保持したいと考えています。どうすれば解決できますか?以外の「一覧」に遷移できますBindingList。シンプルに試してみましList<string>たが、さらに悪いことに、新しいアイテムを追加してもまったく更新されません。

編集

実際には、追加スレッドはリストを認識していますが、WPF ウィンドウを認識していません。リストは内部作業を伴うクラス内にあり、GUI はクラスを検査して表示します。そのためAdd、GUI について知る必要はありません。

4

2 に答える 2

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 に答える