2016-12-12 6 views
0

私はGalasoft.MvvmLight.ViewModelBaseを拡張しているViewModelを持っています。MVVMLIghtで観測可能なコレクションがUIを更新しません

public ObservableCollection<Association> Delegation { get; set; } 

    private async void LoadDelegations() 
    { 
     Delegation.Clear(); 
     var delegations = await NetworkManager.GetDelegations(); 
     if(delegations== null) 
     { 
      return; 
     } 
     for (int i = 0;i< delegations.Count;i++) 
     { 
      Delegation.Add(delegations[i]); 
     } 
    } 

    private async void RemoveDelegation(string delegationId) 
    { 
     var response = await NetworkManager.RemoveDelegation(delegationId); 
     if (response.Result) 
     { 
      int i; 
      for (i = 0; i < Delegation.Count; i++) 
      { 
       if (Delegation[i].Id == delegationId) break; 
      } 

      await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
      { 
       Delegation.RemoveAt(i); 
      }); 
     } 
    } 

このプロパティは、リストビューにバインドされています:それで私は、これは持っている

<ListView ItemTemplate="{StaticResource AssociationTemplate}" 
      ItemsSource="{Binding Delegation}"/> 

私の問題はLoadDelegationではなくRemoveDelegationは、UIを更新したことがない、唯一時々UIを更新することです。

私は間違っていますか?

+0

私はあなたがコレクションを作成しているところはわかりません。バインディングが実行された後に作成している可能性があるため、UIに通知するためにPropertyChangedイベントを発行する必要があります。 (私はGalasoft.MvvmLightに慣れていません) –

+0

Dispatcher.RunAsyncを '非同期void'メソッドでなぜ必要としますか?何か右の臭いはありません。 –

+0

ViewModelコンストラクタでCollectionを作成します。 Dispatcher.RunAsyncはその命令をUIスレッドで実行できますか? –

答えて

0

MVVM-Lightプロシージャについてはわかりませんが、MVVMパターンでは、自動実装されたプロパティを使用している可能性があります。したがって、自動実装されたプロパティは、INotifyPropertyChangedイベントを発生させません。委任の自動実装プロパティを変更することができます。 `private ObservableCollection delegationによって完全なプロパティに変更できます。

public ObservableCollection<Association> Delegation 
    { 
     get { return delegation; } 
     set { delegation = value; RaisePropertyChanged("Delegation")} 
    }` 

RaisePropertyChangedとすぐプロパティの変更などと呼ばれ、ビューがそれについて知ることができますだ方法であるが。そして、MVVM-Lightは単にINotifyPropertyChangedインターフェイスを実装する基本クラスを提供するので、

関連する問題