0

我的应用程序中有以下两个模型:

public class AppSettings : INotifyPropertyChanged
{
   private Units _mainUnits; // Units is an Enum.
   public Units MainUnits {
     get { return _mainUnits; }
     set {
       if (!_mainUnits != value) {
         _mainUnits = value;
         this.OnPropertyChanged("MainUnits");
       }
     }
   }

   // Standard PropetyChanged event, etc. elided (using NotifyPropertyWeaver).
   [...]
}

public class Ride : INotifyPropertyChanged
{
   private double _rideDistance;
   public double RideDistance {
     get { return _rideDistance; }
     set { 
       if (!_rideDistance != value) {
         _rideDistance = value;
         this.OnPropertyChanged("RideDistance");
       }
     }
   }

   // Standard PropetyChanged event, etc. elided (using NotifyPropertyWeaver).
   [...]
}

然后在我的应用程序页面上,我TextBlock绑定了 RideDistance 属性,该属性使用根据枚举的值IValueConverterRideDistance米转换为公里或英里。MainUnits

当模型的值发生更改时,这可以正常工作Ride,但是当用户更改设置页面上的 AppSettings.MainUnit 属性并导航“返回”到显示页面时,我想刷新页面。

例如:

  1. 应用程序启动,页面加载,AppSettings.MainUnits== Units.Imperial,RideDistance显示为“1.3 英里”。
  2. 用户导航到设置页面,并更改AppSettings.MainUntis为 Units.Metric。
  3. 用户按“返回”返回第一页。
  4. 页面现在应RideDistance列为2.1km,但仍以英里为单位列出。

重新启动应用程序会产生所需的行为,就像显式导航到第一页一样,但使用后退按钮不会。

当用户使用后退按钮时,如何强制刷新绑定的属性?

在我的 FodyTest 项目的“RefreshProperties”分支上有一个小型工作应用程序演示了这一点:

刷新属性分支

在此处输入图像描述

单击设置图标以更改单位,导航回开始页面,注意没有区别,然后使用刷新按钮刷新页面...

4

1 回答 1

2

一个有点脏的 hack: - 向 Ride 类添加一个方法 X() ,该类调用 OnPropertyChanged("RideDistance"); - 在 AppSettings.set_MainUnits 中调用 Ride.X();

编辑:另一种有点脏的方法,它重新绑定页面的所有绑定: - 在 MainPage 的 OnNavigatedTo 中,if(e.NavigationMode==Back) {DataContext=null; DataContext=myViewModel;}

于 2012-07-31T07:10:34.927 回答