wpf UI未更新数据上下文更改

时间:2016-05-12 06:36:05

标签: c# wpf mvvm datacontext

我正在开发和wpf应用程序,我需要在点击按钮的基础上更新数据。我尝试更新后面的代码,但它没有工作,所以我使用datacontext但仍然没有用。我看到了各种解决方案,并使用了mode = TwoWay,UpdateSourceTrigger,但它不起作用。

<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 { };
}

有人可以帮忙吗?

1 个答案:

答案 0 :(得分: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);
        }
    }

希望能帮到像我这样的人。