Как создать экземпляр экземпляра IEventAggregator? - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь использовать EventAggregator для публикации sh при нажатии кнопки. Однако проблема заключается в том, что этот код выдает исключение: то есть eventAggregator не установлен для экземпляра объекта. Я попытался включить viewModelLocators в эту ссылку ViewModels в ViewModelLocator MVVM Light , но проблема остается. Существуют ли альтернативные способы установки экземпляра IEventAgregator?

Я уже упоминал следующее:

  1. Что такое ViewModelLocator и каковы его плюсы / минусы по сравнению с DataTemplates ?
  2. http://www.spikie.be/post/2014/06/30/a-practical-guide-to-mvvm- (свет). html
  3. https://prismlibrary.com/docs/viewmodel-locator.html#Custom -ViewModel-Registrations

Код для дальнейшего использования:

Мой MainWindow.xaml имеет:

        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"
        xmlns:local="clr-namespace:WpfApp5"
        xmlns:system="clr-namespace:System;assembly=mscorlib"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True" 
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <!--<Window.Resources>
        <local:UserViewModel x:Key="vm"/>
        <ObjectDataProvider x:Key="myObject" ObjectType="{x:Type local:UserViewModel}" MethodName="UserViewModel">
            <ObjectDataProvider.ConstructorParameters>
                <system:String>"Hi"</system:String>
            </ObjectDataProvider.ConstructorParameters>
        </ObjectDataProvider>
    </Window.Resources>-->
    <Window.Resources>
        <local:ViewModelLocator x:Key="ViewModelLocator"/>
        <local:UserViewModel x:Key="vm"/>

    </Window.Resources>

    <Grid>
        <Button Content="Button1" DataContext="{Binding MainPage, Source={StaticResource ViewModelLocator}}" Command="{Binding ButtonClicked, Source={StaticResource vm}}" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="145,156,0,0" />

    </Grid>
</Window>

EventList.cs:

using Prism.Events;
using System;

public class EventList
{
    public class ButtonclickEvent: PubSubEvent<String> { }
}

UserViewModel.cs:

using Prism.Events;
using System.Windows;
using System.Windows.Input;
using static EventList;

namespace WpfApp5
{
    public class UserViewModel
    {
        public IEventAggregator eventAggregator;
        public ICommand ButtonClicked { get; set; }

        public UserViewModel(IEventAggregator ea)
        {

            this.eventAggregator = ea;
            ButtonClicked = new Command(CanExecute, ExecuteOne);
            eventAggregator.GetEvent<ButtonclickEvent>().Subscribe(EventOneRaised);
        }
        public void ExecuteOne(object parameter)
        {
            eventAggregator.GetEvent<ButtonclickEvent>().Publish("ButtonClickEvent");

        }

        public void EventOneRaised(string message)
        {
            MessageBox.Show(message);
        }
        private bool CanExecute(object arg)
        {
            return true;
        }


    }
}

ViewModelLocator.cs:

using CommonServiceLocator;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Ioc;
using Prism.Events;

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

            if (ViewModelBase.IsInDesignModeStatic)
            {
                SimpleIoc.Default.Register<IEventAggregator, EventAggregator>();
            }
            else
            {
                SimpleIoc.Default.Register<IEventAggregator, EventAggregator>();
            }

            SimpleIoc.Default.Register<UserViewModel>();
        }

        public UserViewModel Main
        {
            get { return SimpleIoc.Default.GetInstance<UserViewModel>(); }
        }
    }
}

...