【问题标题】:wpf UI not updating on data context changewpf UI 未在数据上下文更改时更新
【发布时间】:2016-05-12 06:36:04
【问题描述】:

我正在开发和 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 { };
}

有人可以帮忙吗?

【问题讨论】:

  • 所以,你有一个可能会改变的异步模型。如果您更改整个对象,它将通知您,但如果您更改其中的内容,则不会通知。它里面的对象是否也会发出通知?
  • 内部没有对象不会发出通知。实际上我需要 5 个属性来改变这个其他的还不需要。
  • 尝试在那里发出通知,我也会尝试在更改方法上不使用异步,但我不确定它是否相关。
  • 不改变DataContext,而是更新DataContext中的属性
  • 如果你可以异步加载你的视图模型,为什么要等到之后你的视图被加载?同时进行。

标签: c# wpf mvvm datacontext


【解决方案1】:

我能够通过编辑代码来解决问题。由于重新分配对象,它没有得到通知。我不知道原因,但我只是更改了此代码

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

希望它能帮助像我这样的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 2011-03-31
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多