Я пытаюсь использовать EventAggregator для публикации sh при нажатии кнопки. Однако проблема заключается в том, что этот код выдает исключение: то есть eventAggregator не установлен для экземпляра объекта. Я попытался включить viewModelLocators в эту ссылку ViewModels в ViewModelLocator MVVM Light , но проблема остается. Существуют ли альтернативные способы установки экземпляра IEventAgregator?
Я уже упоминал следующее:
- Что такое ViewModelLocator и каковы его плюсы / минусы по сравнению с DataTemplates ?
- http://www.spikie.be/post/2014/06/30/a-practical-guide-to-mvvm- (свет). html
- 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>(); }
}
}
}