2016-02-21 68 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;)。 –