Обновление элемента пользовательского интерфейса при изменении IsolatedStorageSettings.ApplicationSettings на другой странице. - PullRequest
0 голосов
/ 14 марта 2012

Я создаю игру для Windows Phone, используя Silverlight для графического интерфейса.

У меня в игре две страницы - MainPage и GamePage. MainPage содержит CheckBox'ы для настроек игры, привязанных к классу, который управляет настройками приложения (звук? Вкл .: выкл. И т. Д ...)

<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 в памяти, когда я переключаю настройку звука «OFF» в GamePage, она не отражается в 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();

Тем не менее, я понял, ДУХ! это обновление модели, чтобы отразить то, что в представлении. Это означает, что значение 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? Или мое решение - лучший способ сделать это?

1 Ответ

0 голосов
/ 14 марта 2012

Я думаю, вам нужен один глобальный экземпляр класса AppSettings, созданный в App Resources или в качестве статического поля в классе App, назначенный DataContext обеих страниц. В этой ситуации все изменения будут распространяться на целевые элементы во время события PropertyChanged.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...