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 について知る必要はありません。