我正在尝试学习如何构建WPF应用程序,但在使用EventAggregator类时遇到了一些问题。 现在我有mainWindow.xaml,它看起来像:
<Window.Resources>
<DataTemplate DataType="{x:Type viewModel:LoginViewModel}">
<view:LoginView/>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModel:HomeViewModel}">
<view:HomeView/>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModel:ReportViewModel}">
<view:ReportView/>
</DataTemplate>
</Window.Resources>
<Grid>
<ContentControl Content="{Binding BaseViewModel}"/>
</Grid>
所以,我的计划是根据&#39; BaseViewModel&#39;的值来切换视图。属性。 当我需要更改视图时,我发布了一个类似的事件:
User user = session.login(Username, password);
if(user != null)
{
//publishing the event
_eventAggregator.GetEvent<OpenNewView().Publish((IBaseViewModel)container.Resolve<IHomeViewModel>());
}
我传递给我应该切换到的课程。上面的示例工作正常,但是当我尝试在另一个视图模型上复制此行为时,有些东西不会触发。这是我再次公开活动的时候:
_eventAggregator.GetEvent<OpenNewView>().Publish((IBaseViewModel)container.Resolve<IReportViewModel>());
但是这不是MainWindowModel上的触发器(当正确执行上面的行时)。在这里,当我订阅活动时:
//ctor
public MainViewModel(ILoginViewModel viewModel, IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
eventAggregator.GetEvent<OpenNewView>().Subscribe(OnOpenView);
BaseViewModel = (LoginViewModel)viewModel;
}
方法&#39; OnOpenView&#39;从未被执行过。 在这里,我的&#39; OpenNewView&#39;类:
public class OpenNewView : PubSubEvent<IBaseViewModel>
{
}
注意: 以下是我如何声明EventAggregator类(使用Autofac):
builder.RegisterType<EventAggregator>().As<IEventAggregator>().SingleInstance();
所以,我应该有一个实例。
我是WPF世界的新手,所以我不确定我是否遵循了最佳做法。
注2: 我忘了提一件重要的事情: 如果我用:
替换MainWindowViewModel构造函数 public MainViewModel(IHomeViewModel viewModel, IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
eventAggregator.GetEvent<OpenNewView>().Subscribe(OnOpenView);
BaseViewModel = (HomeViewModel)viewModel;
}
对发布 - 订阅开始在我的HomeViewModel上工作。这有点奇怪......