【问题标题】:Navigation Back & MVVM - How to refresh WP8 page databindingNavigation Back & MVVM - 如何刷新 WP8 页面数据绑定
【发布时间】:2013-10-26 21:38:29
【问题描述】:

我正在开发一个 WP8 应用程序 (C#/XAML)。

在我看来,我指定了一个按钮,该按钮是通过绑定回调来设置的,用于在 VM 未完全加载时启动应用程序。

MVVM 看起来像:

ViewModel
---------
 + Model
   -----
    +Property

并在App.xaml.cs 中创建,如下所示:

public static MainViewModel ViewModel
    {
        get
        {
            if (viewModel == null)
            {
                viewModel = new MainViewModel();
            }
            return viewModel;
        }
    }

并将页面设置为页面构造器中的数据上下文:

DataContext = App.ViewModel;

还有按钮:

<Button x:Name="btn" Content="{Binding Model.Property, FallBackValue='click to load'}" .../>
  • 一开始,btn 没有值可放入其内容中,因为模型为空。

  • 单击btn 时,它会加载模型。它用数据填充模型并导航到显示该数据的另一个页面。

  • 当我向后导航(通过硬件后退按钮)时,我希望btn 使用绑定中的值而不是后备,因为该值已设置。但是它没有使用它,仍然使用绑定的 FallbackValue 参数提供的那个。

如何确保页面“刷新”并使用 ViewModel 提供的实际值?

【问题讨论】:

  • 您能否为这部分问题添加更多深度,因为我不明白您的意思。引用:“它跳回到第一页并且按钮的内容仍然是点击加载而不是Model.Property的值......”
  • 对其进行了编辑。希望它现在更具可读性。我通宵达旦,我的社交技能几乎已经枯竭,所以有时很难理解我。
  • 您可能必须使用 OnNavigatedFrom 函数将填充的对象发送回您的主页。
  • 嗯,包含模型的 ViewModel 是静态的,并通过 DataContext 属性绑定到页面。
  • 但是您确定吗,当您通过导航回到主页离开页面时,这些项目仍然“活跃”,并且垃圾收集器不会处理视图模型/模型,即使它们是静态的,你可以检查一下

标签: c# xaml data-binding mvvm windows-phone-8


【解决方案1】:

我猜您的 ViewModel 将实现 INotifyPropertyChanged。要刷新数据绑定,您只需要引发模型中实现的属性更改事件。在页面的 OnNavigatedTo 事件中,检查 Model 是否为空。如果不提高属性变化

在您的视图模型中

 public class ViewModel:INotifyPropertyChanged
 {   
    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

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

    #endregion
  }

在您的页面中

  protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
  {
        if (App.ViewModel != null)
            App.ViewModel.NotifyPropertyChanged("Name of property");
  }

【讨论】:

  • 这很好,但它不会只是刷新模型中的单个值吗?
  • 我已经解决了它,并且在您发布答案时刚刚完成我自己的答案。 :) 最后我们得出了类似的结论。 :)
【解决方案2】:

啊,好的,我自己找到了解决我问题的方法。

问题

如果您使用的是静态 Datacontext(如果您使用的 Viewmodel 类是静态创建的),那么当您导航回页面时,数据绑定不会更新(至少在我的情况下是这样) .

我对多个页面使用相同的数据上下文(ViewModel 包含多个模型以及一些集合和属性)。但是当我通过硬件返回按钮导航回页面时,数据绑定没有更新。

按钮/文本块的内容停留在旧值,即使您将其更改为新值。

解决方案

重写 OnNavigatedTo 方法,并在构造函数中设置数据绑定。这样您就可以确定数据绑定始终是“新鲜的”和更新的。

在代码隐藏的page 类中(粘贴到您的.xaml 页面的.xaml.cs 文件)写下:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
   base.OnNavigatedTo(e);        //can be left out, base method is empty
   DataContext = null;           //setting datacontext empty at first
   DataContext = App.ViewModel;  //and setting it to the static ViewModel i created
}

这样,当我进入页面时,DataContext 总是首先设置为null(这样旧值就干净了,没有任何东西可以绑定)。

在那之后不久,我把原来的 DataContext 放回去了,所以它又可以绑定一些东西了。

null 的步骤是必要的,因为我需要更改 datacontext 属性,否则如果我再次指向已设置为 dataContext 的同一对象,则不会发生任何事情。

【讨论】:

    猜你喜欢
    • 2019-07-13
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    相关资源
    最近更新 更多