如何在 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 的所有引用。
每次单击按钮时都会触发下面的代码。它有效,但我意识到我不应该在每次播放声音时都检查声音状态和音量。但是,我似乎无法弄清楚如何让 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 的所有引用。