2016-09-07 8 views
-4

C#タスクの外に存在するWPFデータをどのように編集する必要がありますか?標準のWPFテンプレートを使用してUIを定義しました。グリッドは含まれていますUIの更新コードからのスレッド

私のコードで
<TextBlock x:Name="myTextBox" Text="Original Text" /> 

私が持っている:別のスレッドがそれを所有しているので、呼び出し元のスレッドがこのオブジェクトにアクセスすることはできません

using System.Threading.Tasks; 
using System.Windows; 

namespace UpdateGUI 
{ 
    public partial class MainWindow : Window 
    { 
    private int myInt; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     myInt = 0; 
     Task.Factory.StartNew(() => 
     { 
     myInt++; 
     myTextBox.Text = "New Text"; 
     }); 
    } 
    } 
} 

これは、次の例外がスローされます。

どのスレッドがmyTextBoxを所有していますか? myIntを編集してもこのエラーが表示されないのはなぜですか?

+0

UIスレッドのみがUI要素を更新する必要があります。別のスレッドがUIを更新する必要がある場合は、UIスレッドにそのスレッドを実行するように要求する必要があります。これを行う1つの方法は[Dispatcherクラス](https://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.invoke(v = vs.110).aspx)です。 –

+1

または、双方向バインディングメカニズムを使用できます。テキストボックスをモデルのプロパティにバインドすると、モデルを更新してテキストボックスを自動的に更新します。 – rmcsharry

+0

サンプルコードの問題点は、非常に単純なことです。別のスレッドを開始する必要性を正当化するものはありません。なぜあなたがスレッドを生成するのかを説明する、より具体的な必要性がある場合は、より具体的にあなたを導くことができます。 – sstan

答えて

0

あなたがしようとしていることは不可能です。コードはUIスレッドとは別のスレッドで実行されます。

WPFについて詳しく知る必要があります。この作業を取得するために私の知っている2つの解決策があります:

  1. モデルプロパティ
  2. に結合する双方向を使用して、ディスパッチャ

オプション1は、これを行うための通常の方法で実装します双方向バインディングについて学んでください。あなたがやろうとしていることに対して、ディスパッチャーは残忍です。

関連する問題