2014-01-22 37 views
0

我的體系結構如下: 桌面應用程序,.Net 4.5,C#,WPF,MVVM Light,Messenger,IoC - ViewModel定位器,所以ViewModels不知道關於視圖的任何東西。MVVM light,通過Messenger從ViewModel發送消息到尚未初始化的新子窗口

我有一些元素的數據網格主視圖,然後我想在數據網格雙擊後顯示在新/子窗口每個元素的細節。

我已經綁定事件雙擊主視圖到主視圖模型。從主視圖模型中的這個事件處理器,消息通過Messanger發送。

新視圖(新/子窗口)通過代理也在雙視圖中在主視圖中創建。

新建/子窗口是找到他的視圖模型,該視圖模型登記在他的構造函數中的特定消息的視圖。

問題在於新/子窗口(新視圖和視圖模型等)創建得太遲,因爲在新視圖模型註冊時已經發送消息。

你知不知道這樣的建築模式。任何想法將不勝感激。

+0

([將數據傳遞給它時啓動新的視圖模型的最佳途徑]的可能重複http://stackoverflow.com/questions/18497991/best-way-to-pass-數據到新視圖模型--IT-是啓動時/ 18521197#18521197) –

+0

WP7Contrib具有這種稱爲[LastMessageReplayMessenger]實現(http://wp7contrib.codeplex.com/SourceControl/latest#7.0/WP7Contrib.Messaging /LastMessageReplayMessenger.cs)。這些代碼可以在WPF中使用,但codeplex中的.dll僅爲WP創建。查找關於LastMessageReplayMessenger的博客文章[here](http://blogs.xamlninja.com/xaml/wp7-contrib-the-last-messenger) – har07

回答

0

這將有助於確切知道你想做什麼。

如果您的問題只是顯示詳細信息窗口時,在一排雙擊,我會說:在創建啓動只有一個childWindow,並在需要時用它玩visbility。

如果你真的需要一個新的窗口每一次,你可以從你的視圖模型與例如注入服務中創建它。

在任何情況下,您都不必從主視圖創建窗口!您可以在開始時創建一個窗口,也可以從視圖模型動態創建它。

你不能希望從視圖中創建它並在視圖模型中發送消息。

編輯對注射服務,你可以使用類似的東西:

public interface IWindowService 
    { 
    void Open<TWindow>(ViewModelBase viewModel) 
     where TWindow : Window; 
    } 

    public class WindowService : IWindowService 
    { 
     private readonly IUIDispatcher _dispatcher; 

     public WindowService(IUIDispatcher dispatcher) 
     { 
      _dispatcher = dispatcher; 
     } 

     public void Open<TWindow>(ViewModelBase viewModel) 
      where TWindow : Window 
     { 
      _dispatcher.Run(() => OpenThreadSafe<TWindow>(viewModel)); 
     } 

     private static void OpenThreadSafe<TWindow>(ViewModelBase viewModel) where TWindow : Window 
     { 
      var view = (TWindow) Activator.CreateInstance(typeof(TWindow), viewModel); 
      view.Show(); 
     } 
    } 

public class UIDispatcher : IUIDispatcher 
{ 
    public void Run(Action action) 
    { 
     var dispatcher = DispatcherHelper.UIDispatcher; 
     if (dispatcher == null) 
     { 
      action(); 
      return; 
     } 

     DispatcherHelper.CheckBeginInvokeOnUI(action); 
    } 

注意這個DispatcherHelper來自MVVMlight,但你可以很容易地erplace它。

希望它有幫助。

+0

謝謝。 我需要每次創建並打開新窗口dblclick在數據網格上的新(未dblcliked)行... 和dblclick再次在同一行上(當已經打開窗口時)應該彈出窗口。 你可以添加更多關於注入服務的細節。 – catcher

+0

編輯有關注入服務的更多詳細信息 – Ouarzy

0

問題是ViewModel Locator僅在需要時纔會創建viewmodel實例(延遲加載)。

只是配置ViewModelLocator實例化視圖模型渴望,而不是懶惰。這是通過將參數「true」傳遞給IoC容器完成的。

樣品:

namespace Administration.ViewModel 
{ 
    public class ViewModelLocator 
    { 
     public ViewModelLocator() 
     { 
      ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

      //Eager Loading 
      SimpleIoc.Default.Register<UserManagementViewModel>(true); 

      //Lazy Loading 
      SimpleIoc.Default.Register<InformationManagementViewModel>(); 
     } 

     public UserManagementViewModel UserManagementViewModel 
     { 
      get 
      { 
       return ServiceLocator.Current.GetInstance<UserManagementViewModel>(); 
      } 
     } 

     public InformationManagementViewModel InformationManagementViewModel 
     { 
      get 
      { 
       return ServiceLocator.Current.GetInstance<InformationManagementViewModel>(); 
      } 
     } 

     public static void Cleanup() 
     { 
      SimpleIoc.Default.Unregister<UserManagementViewModel>(); 
      SimpleIoc.Default.Unregister<InformationManagementViewModel>(); 
     } 
    } 
} 
相關問題