0

これは私の前の質問の続きです。これが 私の mainwindow.cs です。

   public partial class MainWindow : Window
{
    ObservableCollection<string> store;
    public MainWindow()
    {
     SerialPort _serialPort = new SerialPort(SerialCom.findCOMPort(), 115200, Parity.None, 8, StopBits.One);
     _serialPort.Handshake = Handshake.None;
     string[] query = new string[3] { "t02", "t03", "t04" };
     store = new ObservableCollection<string> { " ", " ", " " };
     this.DataContext = this;
     Thread thread = new Thread(delegate(){Process(store,query,_serialPort);});
     thread.IsBackground = true;
     try
     {
        thread.Start(); //catch sudden serial port closure exception
     }
     catch (Exception)
     {
        thread.Abort();
     }
   }

 public static void Process(ObservableCollection<string> store, string[] query, SerialPort _serialPort)
 {          
     while (true)
     {             
         for (int i = 0; i < 3; i++)
         {
             string add = SerialCom.returnData(query[i], _serialPort);
             if (store[i] != add)
             {
                 store.Insert(i,add);
             }
         }             
         Thread.Sleep(300);

     }
 }

XAML ページに WPF リストビュー コントロールがあります。そのコントロールを非 UI スレッドで変更されている ObservableCollection にバインドしたいと思います。軟膏のハエは、プログラムの実行中にデバイスにクエリを実行する必要がある無限ループのようです。さらに、ObservableCollection は INotifyPropertyChanged を実装しているため、コレクションをコントロールにバインドすると、コントロールは他のコードなしで自動的に更新されます。コード ビハインドまたは XAML で?

4

2 に答える 2

1

バインディング システムから ObservableCollection を使用している場合、バックグラウンド スレッドから更新することはできません。これは、変更を行うスレッドで (INotifyCollectionChanged を介した) 更新通知が発生するためです。ObservableCollection への変更は、UI スレッドにディスパッチする必要があります。

于 2012-10-31T16:00:56.870 に答える
1

BindingOperationsクラス を使用して4.5に良い解決策があります: http://10rem.net/blog/2012/01/16/wpf-45-observable-collection-cross-thread-change-notification

以前のバージョンでは、ディスパッチャー スレッドでコレクションを更新するか、変更通知イベントをディスパッチャー スレッドにプッシュする必要があります: http://julmar.com/blog/mark/?p=41

于 2012-10-31T16:09:48.517 に答える