2016-05-12 13 views
0

私は開発中で、wpf appを開発中で、ボタンをクリックしてデータを更新する必要があります。コードで更新しようとしましたが、動作しませんでしたので、datacontextを使用しましたが、まだ使用していません。私は様々な解決策を見て、mode = TwoWay、UpdateSourceTriggerを使用しましたが、動作しません。wpfデータコンテキストの変更でUIが更新されない

<Grid DataContext="{Binding Dashboard, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"> 
//Content 
</Grid> 
CSファイルで

public ViewModels.DashboardVM _DashVM = new ViewModels.DashboardVM(); 

async private void DashboardPage_Loaded(object sender, RoutedEventArgs e) 
     { 
      try 
      { 
       await _DashVM.GetDashboardData(); 
       this.DataContext = _DashVM; 
      } 
      catch (Exception ex) 
      { 
       System.Diagnostics.Debug.Write(ex.Message); 
      } 
     } 

、ここでデータコンテキストを変更

async private void StoresList_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      try 
      { 
       var item = (sender as ListView).SelectedItem as Models.StoresLM; 
       if(item!=null) 
       { 
        Properties.Settings.Default.StoreId = item.id; 
        Properties.Settings.Default.Save(); 
        await _DashVM.GetDashboardData(); 

        this.DataContext = _DashVM; 
       } 
      } 
      catch (Exception ex) 
      { 
       System.Diagnostics.Debug.Write(ex.Message); 
      } 
     } 

私のビューモデルは

public class DashboardVM : INotifyPropertyChanged 
{ 
    private Models.DashboardM _dashboard; 
    public Models.DashboardM Dashboard 
    { 
     get { return _dashboard; } 
     set { _dashboard = value; RaisePropertyChanged("Dashboard"); } 
    } 

    private void RaisePropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    public static event EventHandler<Boolean> IsLoading = delegate { }; 

    async public Task<Boolean> GetDashboardData() 
    { 
     try 
     { 
      if (InternetTools.IsNetworkConnected()) 
      { 
       IsLoading(this, true); 
       var storeId = Convert.ToString(Properties.Settings.Default.StoreId); 
       var Response = await new WebServiceUtility().PostRequest(string.Format(StringUtility.DashboardApi, Convert.ToString(Properties.Settings.Default.StoreId)), new[] { new KeyValuePair<string, string>("api_key", "dbjh") }); 
       if (Response.IsSuccessStatusCode) 
       { 
        var DashboardData = await Response.Content.ReadAsStringAsync(); 
        var jsonObject = Newtonsoft.Json.Linq.JObject.Parse(DashboardData); 
        if (Convert.ToString(jsonObject["success"]).IndexOf("True", StringComparison.OrdinalIgnoreCase) >= 0) 
        { 
         var DashObject = jsonObject.ToObject<Models.DashboardM>(); 
         Properties.Settings.Default.Currency = DashObject.data.store.currency.StartsWith("&") ? System.Net.WebUtility.HtmlDecode(DashObject.data.store.currency) : System.Text.RegularExpressions.Regex.Unescape(DashObject.data.store.currency); 
         DashObject.data.store.currency = StringUtility.Currency; 
         Properties.Settings.Default.Save(); 
         Dashboard = null; 
         Dashboard = DashObject; 
        } 
       } 
      } 
      else 
       NotificationUtility.ShowErrorMessage(NotificationUtility.MsgType.InternetError); 
     } 
     catch 
     { 

     } 
     IsLoading(this, false); 
     return true; 
    } 
    public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
} 

で誰も助けることができますか?

+0

このように、非同期モデルが変更される可能性があります。 WHOLEオブジェクトを変更すると通知されますが、変更した場合は通知されません。その内部のオブジェクトも通知を発行していますか? – Noctis

+0

内部にオブジェクトはありません通知を上げていません。実際には、私は5つのプロパティを必要とされていない他の内部で変更する必要があります。 – Rohit

+0

通知を試してみてください。また、メソッドの変更時に非同期を使わずに試してみますが、関連するかどうかはわかりません。 – Noctis

答えて

0

コードを編集して問題を解決できました。オブジェクトの再割り当てによって通知されませんでした。理由はわかりませんが、このコードを変更しました。

async private void StoresList_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     try 
     { 
      var item = (sender as ListView).SelectedItem as Models.StoresLM; 
      if(item!=null) 
      { 
       Properties.Settings.Default.StoreId = item.id; 
       Properties.Settings.Default.Save(); 
       await _DashVM.GetDashboardData(); 
      } 
     } 
     catch (Exception ex) 
     { 
      System.Diagnostics.Debug.Write(ex.Message); 
     } 
    } 

私のような誰かに役立つことを願っています。

関連する問題