繁体   English   中英

Navigation Back和MVVM-如何刷新WP8页面数据绑定

[英]Navigation Back & MVVM - How to refresh WP8 page databinding

我正在做WP8应用程序(C#/ XAML)。

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

MVVM看起来像:

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

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

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

并将页面设置为页面的conconctor中的datacontext:

DataContext = App.ViewModel;

和按钮:

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

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

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

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

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

问题

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

我对多个页面使用相同的datacontext(ViewModel包含多个模型,并且在某些集合和属性内)。 但是,当我通过硬件后退按钮导航回该页面时,数据绑定未更新。

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

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

在隐藏代码的page类内部( .xaml.cs.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的同一个对象,则不会发生任何事情。

我猜你的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");
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM