在另一页上更改IsolatedStorage Settings.Application Settings时更新UI元素

时间:2012-03-14 00:14:40

标签: silverlight windows-phone-7

我正在使用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上)吗?或者我的解决方案是最好的方法吗?

1 个答案:

答案 0 :(得分:0)

我认为您需要在AppSettings中创建一个App Resources类的全局实例,或者在App类中分配给两个页面DataContext的静态字段。在这种情况下,所有更改都将在PropertyChanged事件期间传播到目标元素。