2013-10-26 118 views
1

我有以下問題發送時MVVM燈消息沒有收到:從視圖模型構造

我註冊4周的ViewModels與SimpleIoc在ViewModelLocator。 在MainViewModel的構造器中,我向其他3個ViewModel中的2個發送消息。 這些視圖模型未收到這些消息。

消息本身正在工作,因爲當我稍後發送消息時,這些ViewModel會按預期做出反應。

所以我期望接收的ViewModels不會在我從MainViewModel構造函數發送消息的時候偵聽。所以我切換了我用SimpleIoc註冊ViewModel的順序,但無濟於事。

我在做什麼錯?

ViewModelLocator

static ViewModelLocator() 
    { 
     ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

     SimpleIoc.Default.Register<LoginMethodVM>(); 
     SimpleIoc.Default.Register<DatabaseConnDataVM>(); 
     SimpleIoc.Default.Register<UserCredentialsVM>(); 
     SimpleIoc.Default.Register<BrowserSelectionVM>(); 
     SimpleIoc.Default.Register<MainViewModel>(); 
    } 

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

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

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

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

MainViewModel

public MainViewModel() 
    { 
     Messenger.Default.Send(System.Windows.Visibility.Visible, "UserCredentialsVisible"); 
     Messenger.Default.Send(System.Windows.Visibility.Visible, "BrowserSelectionVisible"); 
    } 

BrowserSelectionVM

public BrowserSelectionVM() 
    { 
     Messenger.Default.Register<System.Windows.Visibility> 
      (this, 
      "BrowserSelectionVisible", 
      msg => { Visible = msg; }); 

    } 

個UserCredentialsVM

public UserCredentialsVM() 
    { 
     Messenger.Default.Register<System.Windows.Visibility> 
      (this, 
      "UserCredentialsVisible", 
      msg => { Visible = msg; }); 
    } 
+1

被實例化時,你從MainViewModel –

+0

我的直覺是,接收器沒有,但我不能告訴我們,發送郵件,這些視圖模型改變序列不會有幫助。 – MPL

+0

因此,如果您尚未在內存中創建視圖模型的實例,那麼註冊命令不會運行,因此沒有任何註冊可以接收消息。試一試,在你的MainViewModel構造函數調用Sends之前,創建每個視圖模型的一個實例。 SimpleIOC與這個問題無關,因爲它所做的只是注入到你的視圖模型中,並且你的視圖模型中沒有注入的構造函數參數。 –

回答

1

ViewModelLocator.cs

static ViewModelLocator() 
    { 
     ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

     SimpleIoc.Default.Register<UserCredentialsVM>(true); 
     SimpleIoc.Default.Register<BrowserSelectionVM>(true); 
     SimpleIoc.Default.Register<MainViewModel>(); 
    } 

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

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

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

    public static void Cleanup() 
    { 
    } 

BrowserSelectionVM.cs

public class BrowserSelectionVM : ViewModelBase 
{ 
    public BrowserSelectionVM() 
    { 
     Messenger.Default.Register<System.Windows.Visibility>(this, 
      "BrowserSelectionVisible", 
      msg => { Console.WriteLine(msg); }); 
    } 
} 

UserCredentialsVM.cs

public class UserCredentialsVM : ViewModelBase 
{ 
    public UserCredentialsVM() 
    { 
     Messenger.Default.Register<System.Windows.Visibility>(this, 
      "UserCredentialsVisible", 
      msg => { Console.WriteLine(msg); }); 
    } 
} 

主ViewModel.cs

public class MainViewModel : ViewModelBase 
{ 
    public MainViewModel() 
    { 
     Messenger.Default.Send(System.Windows.Visibility.Visible, "UserCredentialsVisible"); 
     Messenger.Default.Send(System.Windows.Visibility.Visible, "BrowserSelectionVisible"); 
    } 
} 

MainWindow.xaml

<Window x:Class="MvvmLightRegistrationMock.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    DataContext="{Binding MainViewModel, Source={StaticResource Locator}}"> 

<Grid x:Name="LayoutRoot"> 
</Grid> 

+0

我沒有看到任何區別。 – MPL

+0

@MPL我無法重現您所看到的內容。在我的測試環境中,我可以看到兩個可見的消息。我已經更新了我的答案,併發布了來自我的測試環境的代碼。 – rschoenbach