2016-02-21 71 views
0

下面的代码每次点击一个按钮时触发。它有效,但我意识到我不应该每次播放声音时检查声音状态和音量。然而,我似乎无法弄清楚如何让ViewModel以任何其他方式更新ApplicationData。我有一个Settings ViewModel,它使用切换开关设置声音状态,并为音量设置滑块。如何在ApplicationData设置更改时更新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(); 
     } 
    } 
+0

_What_视图模型? – MickyD

+0

您尚未向任何人提供足够的信息来帮助您解决问题。您的描述对读者而言很模糊,并且您没有提供ViewModel。 –

回答

1

每当我需要分享多的ViewModels之间的行为(在这里,你的行为是“存储和检索设置)中,我实现了‘服务’在你的情况下,它可能看起来像:

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; 
     }  
    } 
} 

然后你只需要注册您的服务作为独立的,并在你的ViewModels检索。理想情况下,你可以做到这一点使用依赖注入,但如果没有的IoC机制是由什么MVVM框架你用那么一个服务定位器提供可以完成这项工作,从这里开始,只需要在SettingsViewModel和readi中设置SettingsService.LocalSoundVolume属性从你的其他视图模型。由于该值已被缓存,因此您只需从ApplicationData设置中检索一次。

在此之后的模式,你应该能够从您的ViewModels删除对所有的ApplicationData引用。

+0

KooKiz,那很完美!谢谢。所以,我完全按照你的建议做了。我创建了一个服务使用上面的代码,加入一个Singleton,添加的代码为localSettingSoundState,除去所有的ApplicationData代码从我的ViewModels,加入到该单件的引用(Services.SettingsService settingServices = Services.SettingsService.Instance),并在需要时在我的ViewModels中设置值(例如settingServices.LocalSoundVolume = sliderValue;)。 –