0

アプリには次の 2 つのモデルがあります。

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 プロパティにバインドします。IValueConverterRideDistanceMainUnits

これは、Rideモデルの値が変更されると正常に機能しますが、ユーザーが設定ページで AppSettings.MainUnit プロパティを変更し、表示ページに「戻る」ときにページを更新したいと考えています。

例えば:

  1. アプリの起動、ページの読み込み、AppSettings.MainUnits== Units.Imperial、RideDistance「1.3 マイル」と表示されます。
  2. ユーザーは [設定] ページに移動し、AppSettings.MainUntisUnits.Metric に変更します。
  3. ユーザーは「戻る」を押して最初のページに戻ります。
  4. ページはRideDistanceとして2.1km表示されるようになりましたが、まだマイルで表示されています。

アプリを再起動すると、最初のページに明示的に移動する場合と同様に目的の動作が得られますが、戻るボタンを使用するとそうではありません。

ユーザーが [戻る] ボタンを使用したときに、バインドされたプロパティを強制的に更新するにはどうすればよいですか?

私の FodyTest プロジェクトの「RefreshProperties」ブランチには、これを示す小さな実用的なアプリがあります。

RefreshProperties ブランチ

ここに画像の説明を入力

設定アイコンをクリックして単位を変更し、開始ページに戻りますが、違いに気付かず、更新ボタンを使用してページを更新します...

4

1 に答える 1

2

やや汚いハック:-OnPropertyChanged( "RideDistance");を呼び出すRideクラスにメソッドX()を追加します。-AppSettings.set_MainUnitsでRide.X();を呼び出します。

編集:ページのすべてのバインディングを再バインドするもう1つのやや汚いアプローチ:-MainPageのOnNavigatedToで、if(e.NavigationMode == Back){DataContext = null; DataContext = myViewModel;}

于 2012-07-31T07:10:34.927 に答える