2017-11-17 11 views
1

ベンダーを使用する場合に設定されていないが、私は別のスレッドで実行するようにLoadVendorsを()希望のコンボボックスプロパティTask.Run

//This works, Vendor is set 
LoadVendors(); 
Vendor = Vendors.FirstOrDefault(); 

にバインドされている、しかし、ベンダーが設定されていません。誰かが助けることができますか?

//Doesn't work, Vendor is not set! 
System.Threading.Tasks.Task.Run(() => LoadVendors()).ContinueWith((t) => Vendor = Vendors.FirstOrDefault()); 

ベンダー

public ObservableCollection<Vendor> Vendors 
    { 
     get 
     { 
      return _vendors; 
     } 

     set 
     { 
      if (_vendors != value) 
      { 
       var oldVendors = new ObservableCollection<Vendor>(_vendors); 
       _vendors = value; 
       RaisePropertyChanged(nameof(Vendors), oldVendors, Vendors, true); 
      } 

     } 
    } 

LoadVendors

private void LoadVendors() 
    { 

      var vendors = DataHelper.GetVendors() 
      DispatcherHelper.CheckBeginInvokeOnUI(() => Vendors.Clear()); 
      vendors.ForEach(dcpV => 
      {      
       DispatcherHelper.CheckBeginInvokeOnUI(() => Vendors.Add(vendor)); 
      }); 
      RaisePropertyChanged(nameof(Vendors)); 

    } 
+0

RaisePropertyChangedの両方の呼び出しがちょっと面白く見えますが、ライブラリを使用していますか? – nvoigt

+0

@nogigt実際MVVMLightライブラリ[リンク](http://www.mvvmlight.net/help/WP8/html/f88345df-bea6-aa85-4d3c-90b1cbded839.htm) – BertAR

+0

リスト/コレクションのプロパティの設定を避けてください。データを変更する必要がある場合は、 'Add'メソッドと' Clear'メソッドを使用できます。私はほとんどそれがより簡単に動作することを保証することができます。 – Default

答えて

2

は、バックグラウンドスレッドでDataHelper.GetVendorsメソッドを呼び出し、バックUIスレッド上の他のすべての操作を行います。

Task.Factory.StartNew(()=> DataHelper.GetVendors()) 
    .ContinueWith(task => 
    { 
     Vendors.Clear(); 
     foreach (var vendor in task.Result) 
      Vendors.Add(vendor); 
     RaisePropertyChanged(nameof(Vendors)); 
     Vendor = Vendors.FirstOrDefault(); 
    }, System.Threading.CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()); 
+0

なぜTaskScheduler.FromCurrentSynchronizationContext()が必要ですか? – BertAR

+0

ContinueWithがUIスレッドで実行されるようにします。 – mm8

+0

@ mm8あなたは 'await Task.Run(..) 'を使ってこれを大幅に単純化することができます。 – JSteward

関連する問題