2

次の問題があります。

ViewModelLocator の SimpleIoc に 4 つの ViewModel を登録しています。MainViewModel のコンストラクターで、他の 3 つの ViewModel のうち 2 つにメッセージを送信します。これらのメッセージは、これらの ViewModel によって受信されません。

後でこれらのViewModelでメッセージを送信すると、期待どおりに反応するため、メッセージング自体は機能しています。

そのため、MainViewModel コンストラクターからメッセージを送信する時点で、受信側の ViewModel がリッスンしていないことが予想されます。そこで、ViewModel を SimpleIoc に登録する順序を変更しましたが、役に立ちませんでした。

私は何を間違っていますか?

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; });
    }
4

1 に答える 1

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); });
    }
}

MainViewModel.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>

于 2013-10-26T19:21:46.023 に答える