2013-04-29 79 views
2

我在我的WinRT項目中有一個靜態的UserAccount類。該類包含有關當前登錄用戶的各種靜態屬性(如用戶名,電子郵件地址,...)。我需要這個信息可以從任何視圖使用綁定(例如 - 我想顯示個性化的消息"Welcome, {0}" - 傳遞用戶名 - 在應用程序的一頁),但我需要確保,這些條件得到滿足:靜態屬性/ ViewModel(C#,WinRT)

  1. 以正確MVVM圖案方式實現它
  2. 當用戶切換到當應用程序正在運行通設置魅力另一個帳戶,結合的字段(如消息等等)應該自動與新更新數據。

我認爲這將有可能像全球UserAccountViewModel創造的東西,這將是具有所需性能的經典視圖模型,並會從靜態UserAccount類進行手動更新,但不似乎是最好的解決方案。

你能否想到一個更好的方法來實現這一目標並滿足上述兩個條件?

任何幫助極大的讚賞。

編輯: 類似的情況又一個類別中發生,我需要 - NetworkStatus - 其中有IsInternetAvailable知道應用是否被連接,但我需要使用這個布爾綁定到不同的按鈕的IsEnabled屬性中的應用。

+1

是否可用於Windows RT XAML {x:Static namespace:Class.Property}?如果沒有一種方法可以使用依賴注入容器並將您的用戶帳戶信息註冊爲單個實例類型。因此,您的ViewModel可以將UserAccount注入到構造函數中。你在使用DI嗎? – Alan 2013-04-29 14:38:34

+0

我認爲x:Static不可用。我想到了DI方法,但是這使得從代碼隱藏(例如 - 其中一個屬性是AccessToken,我用它從Web服務加載數據)導致了對UserAccount類屬性的一些不友好的訪問 - 現在我將不得不做一些像ViewModelLocator.UserAccount.AccessToken(本質上更麻煩的代碼))還是有另一種方法來實現這一點? – 2013-04-29 17:52:17

+1

爲什麼你需要從後面的代碼訪問視圖模型屬性?這是屬於視圖模型的內容。 – 2013-04-30 04:19:55

回答

2

s創建一個基本ViewModel,所有其他ViewModel繼承自。您無需將其設爲靜態即可進行全部訪問,因爲每個ViewModel都可以訪問它。在綁定中,您不指定base.Property要麼。

包含屬性的抽象視圖模型填充此數據的功能。

public abstract class UserAccountViewModel : ObservableObject, IViewModel 
{ 
    //use private member and do a RaisePropertyChanged("Username") 
    public string Username { get; set; } 

    private void GetUserInformation() 
    { 
     Username = BusinessLogic.GetUsername(); 
    } 
} 

現在你讓你的ViewModels繼承它

public class OtherViewModel : UserAccountViewModel { } 

而且你可以直接在綁定到parent屬性OtherView.xaml:

<TextBlock Text="{Binding Path=Username, Mode=OneWay}" /> 

BusinessLogic類有靜態GetUsername( )方法檢索用戶名。爲了不重複工作量,只檢索一次,但提供很多。所以你會將它靜態存儲在你的businesslogic中,直到它所調用的Refresh概念。

或者,你可以有一個視圖模型所採集你需要的數據,那麼無論你想通過周圍這需要所有其他的ViewModels用戶EventAggregator或。這將消除靜態的businesslogic想法。使用Prism的EventAggregator非常好,ViewModels訂閱和一個(或多個)發佈事件,幷包含對象/數據。因此,這些其他ViewModel可以立即訂閱和接收,或者您可以進行雙向通信並獲得ViewModel的「請求」,然後獲得「響應」。不知道你是否可以利用它,或者必須推出自己的,但是這個概念是有效的,並且可以通過至少傳遞一個UserInfo對象的事件來完成。

+0

對不起,花了我很長時間來標記你的答案,我不小心忘了這麼做;-)。 – 2014-01-11 12:40:04