2

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

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

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 提供的实际值?

4

2 回答 2

4

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

问题

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

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

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

解决方案

覆盖 OnNavigatedTo 方法,并在构造函数中设置数据绑定。通过这种方式,您可以确定数据绑定始终是“新鲜的”和更新的。

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

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 放回去了,所以它有一些东西可以再次绑定。

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

于 2013-10-18T08:11:48.853 回答
2

我猜你的 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");
  }
于 2013-10-18T08:09:51.217 回答