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