如何在 ApplicationData 设置更改时更新 ViewModel class 变量?

How to update a ViewModel class variable when ApplicationData settings have changed?

每次单击按钮时都会触发下面的代码。它有效,但我意识到我不应该在每次播放声音时都检查声音状态和音量。但是,我似乎无法弄清楚如何让 ViewModel 以任何其他方式更新 ApplicationData。我有一个 Settings ViewModel,它使用切换开关和音量滑块设置声音状态。

理想情况下,我认为 ViewModel 会在导航回时更新 class 变量,或者设置 ViewModel 会调用此 ViewModel 中的更新方法。但我似乎无法让它工作,除非在 PlaySound 方法中更新它。

public object localSettingSoundState;
public object localSoundVolumeSetting;
ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings;


    public void PlaySound(MediaElement mediaElementName)
    {
        localSettingSoundState = localSettings.Values["localSoundSetting"];
        MediaElementVolume = Convert.ToDouble(localSettings.Values["localSoundVolumeSetting"]);

        if (localSettingSoundState.ToString() != "false")
        {
            mediaElementName.Play();
        }
    }

每当我需要在多个视图模型之间共享行为时(在这里,您的行为是 "storing and retrieving settings), I implement a "service”。在您的情况下,它可能看起来像:

public class SettingsService
{
    private readonly ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings;

    private double? localSoundVolume;

    public double LocalSoundVolume
    {
        get
        {
            if (this.localSoundVolume == null)
            {
                this.localSoundVolume = Convert.ToDouble(localSettings.Values["localSoundVolumeSetting"])
            }

            return this.localSoundVolume;
        }

        set
        {
            this.localSoundVolume = value;
            localSettings.Values["localSoundVolumeSetting"] = value;
        }       
    }
}

然后您只需将您的服务注册为单例并在您的视图模型中检索它。理想情况下,您可以通过使用依赖注入来做到这一点,但如果您使用的任何 MVVM 框架都没有提供 IoC 机制,那么服务定位器就可以完成这项工作。从那里开始,只需从您的 SettingsViewModel 设置 SettingsService.LocalSoundVolume 属性 并从您的其他视图模型读取它。由于该值已缓存,您只需从 ApplicationData 设置中检索一次。

按照此模式,您应该能够从视图模型中删除对 ApplicationData 的所有引用。