2014-03-12 55 views
0

我正在編寫Windows Phone聊天應用程序,我想實施ChatPage,它將用於保留對話視圖。整個想法是儘可能地創建與SMS頁面非常相似的視圖,並在該頁面的實例之間切換。Windows Phone 8與MVVM一個頁面的多個實例

問題來了 - 在頁面的每個實例上,我需要綁定存儲在XML文件中的ContactContactMessages。我認爲從XML文件獲取適當的消息Contact可以簡單地寫在構造函數中。但是如何打開頁面的新實例併發送它Contact

我正在使用MVVM Light工具包,我可以使用Messanger來做到這一點,但我怎樣才能確保我的Contact不會在其他頁面實例中註冊。在這種情況下注冊一個ChatPageViewModel的實例不能在ViewModelLocator中實現,因爲我需要使用ViewModel的多個實例(如果我錯了,我是MVVM中的新手)。

是否有辦法實現這一目標?或者,也許我正在考慮的方式是完全錯誤的?

回答

0

您可以嘗試使用界面進行服務。並且當客戶點擊聯繫人時,傳遞該服務可以搜索的參數與聯繫人一起返回消息。每個需要此服務的ViewModel都可以從構造函數中獲取。只有你需要一些參數才能知道要讀取哪個xml。

我不知道是否一個IoC容器。 Unity或Autofac或其他人也可以解決您的問題。

如果使用Autofac你可以有一個相似的類比這

public class ViewModelLocator 
{ 
    private IContainer container; 
    public ViewModelLocator() 
    { 
     ContainerBuilder builder = new ContainerBuilder(); 

     builder.RegisterType<MainViewModel>(); 

     container = builder.Build(); 
    } 

    public MainViewModel MainViewModel 
    { 
     get { return container.Resolve<MainViewModel>(); } 
    } 
} 

你還可以用這個實例這樣的工作參數:

builder.RegisterType<MainViewModel>().InstancePerDependency(); 

builder.RegisterType<MainViewModel>().InstancePerLifetimeScope(); 

builder.RegisterType<MainViewModel>().SingleInstance(); 

更多信息here for Autofachere for Unity

希望有所幫助。問候!

0

我會去這種情況下,基於MVVM光:

在中央頁面你把所有的聯繫人列表。只要用戶選擇一個聯繫人,您就會廣播一條消息,指出已選擇聯繫人。對話視圖模型訂閱此消息並從模型加載對話。聯繫人視圖模型使用navigation service導航到對話視圖。

(的部分)的接觸視圖模型:

public ContactsViewModel(IDataService dataService, INavigationService navigationService) 
{ 
    _dataService = dataService; 
    _navigationService = navigationService; 
} 

private RelayCommand _showConversation; 

public RelayCommand ShowEvents 
{ 
    get 
    { 
     return _showConversation ?? (_showConversation = new RelayCommand(ExecuteShowConversation)); 
    } 
} 

private void ExecuteShowConversation() 
{ 
    Messenger.Default.Send(new ContactSelectedMessage(){Contact = Contact); 
    _navigationService.NavigateTo(new Uri("/Views/ConversationView.xaml", UriKind.RelativeOrAbsolute)); 
} 

(的部分)的對話視圖模型:

public ConversationViewModel(IDataService dataService, INavigationService navigationService) 
{ 
    _dataService = dataService; 
    _navigationService = navigationService; 
    Messenger.Default.Register<ContactSelectedMessage>(this, OnContactSelected); 
} 

private void OnContactSelected(ContactSelectedMessage contactSelectedMessage) 
{ 
    _dataService.GetConversation(contactSelectedMessage.Contact); 
} 

爲了使視圖模型接收消息之前所述消息是它應該被實例化廣播。所以,你必須在ViewModelLocator中實例化它。

在ViewModelLocator:

static ViewModelLocator() 
{ 
    /// parts missing for brevity 

    SimpleIoc.Default.Register<IDataService, DataService>(); 
    SimpleIoc.Default.Register<INavigationService, NavigationService>(); 
    SimpleIoc.Default.Register<ContactsViewModel>(); 
    SimpleIoc.Default.Register<ConversationViewModel>(true); 
} 
相關問題