我正在使用Silverlight为GUI构建Windows Phone游戏。
我在游戏中有两个页面 - MainPage和GamePage。 MainPage包含用于游戏设置的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}" />
在模型中,我使用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");
}
}
更改MainPage中的设置可以正常工作。我也可以在GamePage中打开或关闭声音。但是,因为ViewModel在内存中创建了自己的“副本”(不确定正确的术语)AppSettings,当我在GamePage中将声音设置为“OFF”时,当我向后导航时它不会反映在MainPage中。 IsolatedStorageSettings在AppSettings的构造函数中初始化。
// 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());
}
}
我以为我可以更新BindingExpression
Trajectory.GetBindingExpression(CheckBox.IsCheckedProperty).UpdateSource();
然而,我想出了DUH!即更新模型以反映视图中的内容。这意味着SoundEffectsSetting值(在模型中)被更改为Sound复选框的当前状态(在ViewModel中)。
所以,我做的是这个:
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中更改声音设置时,可以使用数据绑定来更新Sound复选框(在MainPage上)吗?或者我的解决方案是最好的方法吗?
答案 0 :(得分:0)
我认为您需要在AppSettings
中创建一个App Resources
类的全局实例,或者在App
类中分配给两个页面DataContext
的静态字段。在这种情况下,所有更改都将在PropertyChanged
事件期间传播到目标元素。