2011-01-08 34 views
1

我正在構建我的第一個Silverlight應用程序。這個應用程序有幾種形式,允許用戶保存客戶,供應商,員工等。每個頁面有一個父控件(帶有相應的視圖模型)和一個或多個子控件(每個控件都有一個自己的視圖模型)。例如,客戶表單將客戶用戶控件作爲父級,並將地址用戶控件,電話號碼用戶控件作爲子用戶控件放在表單上。現在,當用戶點擊保存按鈕時,父母「客戶」負責確保爲客戶,地址和電話保存數據。在幕後,我可以在客戶,地址和電話號碼視圖模型之間共享一個datacontext實例。所以當點擊保存按鈕時,客戶用戶控件可以保存所有三個數據(因爲它的datacontext也有Address和PhoneNumber實體)。在視圖模型之間共享上下文

我想知道如何將這個datacontext從客戶傳遞給地址和電話號碼?一種方法可能是將datacontext傳遞到Address和Phone number視圖模型的各自構造函數中,但接下來我需要確保Address和PhoneNumber構造函數僅在Customer viewodel創建後才被調用。能有更好的解決方案嗎? MEF是否提供更好的解決方案?

回答

1

您擁有Silverlight客戶端的強大功能。含義:你有靜態:-)

我在最近的應用程序中這樣做的方式是創建一個ContextCache。基本上,它是一個靜態類,它保存了我的任何ViewModel中使用的所有RIA上下文。像這樣:

public static class ContextCache 
    { 
    private static TicketContext _ticketContext; 

    public static TicketContext TicketContext 
    { 
     get 
     { 
     if (_ticketContext == null) 
      _ticketContext = new TicketContext(); 

     return _ticketContext; 
     } 
     private set { _ticketContext = value; } 
    } 
    } 

所以,在一個視圖模型,你只是做給ContextCache.TicketContext打個電話,你可以保存更改。通過這種方式,您可以利用RIA中的所有狀態更改跟蹤,並讓它爲您處理有關對象持久性的所有細節(如果您已正確編寫了服務代碼,但那是另一回事)。

0

也許你的體系結構有一個不好的解決方案,你可以用IsolatedStorageFile來模擬ASP.NET的會話!

從我的理解中,您正嘗試在應用程序中過度使用MV-VM模式! ViewModel來到我們的生活的重要原因之一是因爲單元測試!如果我是你,我會有一個Customer ViewModel並在我所有的子用戶控件中使用!

根據複雜性和隔離性,如果子控件要求它擁有單獨的ViewModel,則可以考慮父項ViewModel並具有子項ViewModel的屬性。

public class ParentViewModel : FrameworkElement { 

    Child1ViewModel Child1 { get; set; } //Must be a dependency property 

    Child1ViewModel Child2 { get; set; } //Must be a dependency property 

    ICommand SaveButtonCommand; //Your delegate command of your save button 

    public ParentViewModel() { 
     Child1 = new Child1ViewModel(); 
     Child2 = new Child2ViewModel(); 
    } 
} 

而且你可以使用這個父視圖上的父XAML

<UserControl.DataContext> 
    <ViewModels:ParentViewModels /> 
</UserControl.DataContext> 
<Controls:Child1 DataContext="{Binding Child1}" /> 
<Controls:Child2 DataContext="{Binding Child2}" /> 

你也有你的ParentViewModelICommand SaveButtonCommand並點擊時與你的孩子ViewModelproperties操縱!

希望它有幫助!

相關問題