2012-03-14 21 views
0

私は、GUI用にSilverlightを使用してWindows Phoneのゲームを構築しています。IsolatedStorageSettings.ApplicationSettingsが別のページで変更されたときのUI要素の更新

メインページとゲームページは2ページあります。メインページは、ゲームの設定のためのCheckBox'esは、アプリケーションの設定を制御するクラスにデータバインド含まれています

<local:AppSettings x:Key="appSettings"></local:AppSettings> 

...モデルで

<CheckBox x:Name="Sound" Content="CheckBox" Height="80" Margin="258,0,262,134" Style="  {StaticResource CheckBoxStyle2}" VerticalAlignment="Bottom" 
        IsChecked="{Binding Source={StaticResource appSettings}, Path=SoundEffectsSetting, Mode=TwoWay}" /> 

(?上の音を...オフ、など)、I IsolatedStorageSettings.ApplicationSettingsを使用して設定を保持します。

/// <summary> 
    /// Property to get and set a Sound Effects Setting key. 
    /// </summary> 
    public bool SoundEffectsSetting 
    { 
     get 
     { 
      return GetValueOrDefault<bool>(SoundEffectsSettingKeyName, SoundEffectsSettingDefault); 
     } 
     set 
     { 
      AddOrUpdateValue(SoundEffectsSettingKeyName, value); 
      Save(); 
      NotifyPropertyChanged("Sound"); 
     } 
    } 

メインページの設定を変更しても問題ありません。 GamePageでサウンドをオンまたはオフにすることもできます。しかし、ViewModelはメモリにAppSettingsの独自の「コピー」(正しい用語がわからない)を作成するため、GamePageのサウンド設定を「OFF」にすると、戻るときにMainPageに反映されません。 IsolatedStorageSettingsは、AppSettingsのコンストラクタで初期化されます。私はちょうどBindingExpression

Trajectory.GetBindingExpression(CheckBox.IsCheckedProperty).UpdateSource(); 

を更新できると考え

// Our isolated storage settings 
    IsolatedStorageSettings isolatedStore; 

/// <summary> 
    /// Constructor that gets the application settings. 
    /// </summary> 
    public AppSettings() 
    { 
     try 
     { 
      // Get the settings for this application. 
      isolatedStore = IsolatedStorageSettings.ApplicationSettings; 

     } 
     catch (Exception e) 
     { 
      Debug.WriteLine("Exception while using IsolatedStorageSettings: " + e.ToString()); 
     } 
    } 

はしかし、私はDUHを考え出しました!ビュー内の内容を反映するためにモデルを更新しています。つまり、(モデル内の)SoundEffectsSetting値が(ViewModelの)Soundチェックボックスの現在の状態に変更されます。

だから、私がやったことはこれです:

protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 

     if (!_Loaded) 
     { 
      AppSettings appSettings = new AppSettings(); 

      if (appSettings.SoundEffectsSetting) 
      { 
       Sound.IsChecked = true; 
      } 
      else 
      { 
       Sound.IsChecked = false; 
      } 

      if (appSettings.TrajectorySetting) 
      { 
       Trajectory.IsChecked = true; 
      } 
      else 
      { 
       Trajectory.IsChecked = false; 
      } 

     } 

     base.OnNavigatedTo(e); 
    } 

_LoadedはOnNavigatedFrom方式に切り替えました。

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) 
    { 

     _Loaded = false; 
     base.OnNavigatingFrom(e); 
    } 

今質問します。 GamePageでサウンド設定が変更された場合、データバインディングを使用してサウンドチェックボックス(メインページ上)を更新できますか?それとも、私のソリューションが最良の方法ですか?

答えて

0

App Resourcesに作成されたAppSettingsクラスのグローバルインスタンスまたは両方のページのDataContextに割り当てられたAppクラスの静的フィールドが必要です。この状況では、PropertyChangedイベント中にすべての変更がターゲット要素に伝播します。

関連する問題