ViewModels之间的棱镜中的EventAggregator

时间:2018-01-23 09:45:56

标签: mvvm xamarin.forms prism

我试图使用eventAggregator和最新的Prism v7制作样本。 该示例使用Prism模板包构建,一个页面带有一个加载另一个页面的按钮,在按钮中我发布一个事件,在第二个页面的构造函数中我订阅它,然后在标签上写入,如果事件已经收到

第一页:

<StackLayout HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand">
        <Label Text="Welcome to Xamarin Forms and Prism!" />
        <Button Command="{Binding Button1Command}" Text="ContentPage1" />
</StackLayout>

第二页:

<StackLayout HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand">
        <Label
            HorizontalOptions="CenterAndExpand"
            Text="{Binding Message}"
            VerticalOptions="CenterAndExpand" />
    </StackLayout>

第一个视图模型:

public class MainPageViewModel : ViewModelBase
    {    
        IEventAggregator _ea;

        public MainPageViewModel(INavigationService navigationService, IEventAggregator eventAggregator) 
            : base (navigationService)
        {
            Title = "Main Page";    
            _ea = eventAggregator;
        }

        public DelegateCommand<string> Button1Command => new DelegateCommand<string>(Button1Navigate);

        private async void Button1Navigate(string par)
        {           
            _ea.GetEvent<BasicEvent>().Publish("basicEvent");
            await NavigationService.NavigateAsync("PrismContentPage1");    
        }        
    }

第二个ViewModel:

public class PrismContentPage1ViewModel : BindableBase
    {
        IEventAggregator _ea;

        private string _message;
        public string Message
        {
            get { return _message; }
            set { SetProperty(ref _message, value); }
        }

        public PrismContentPage1ViewModel(IEventAggregator eventAggregator)
        {
            _ea = eventAggregator;    
            _ea.GetEvent<BasicEvent>().Subscribe(OnInitializationEventFired);
        }

        public void OnInitializationEventFired(string message)
        {
            Message = "received";
        }
    }

标签永远不会收到&#34;收到&#34;串。 我删除了许多其他测试的代码:我在第二页中添加了一个按钮,从同一个ViewModel内部发布,然后工作。 我调试并检查了eventAggregator,如果在第二页中初始化时它实际上有1个项目,即BasicEvent。

我第一次运行它时,它没有触发事件,然后我回到第一页(我知道,没有取消订阅),然后再次按下按钮,这次第二次被解雇,但是但是,标签中的消息没有改变。

看起来一切都非常简单,样品(HamburgerMenu,UsingEventAggregator)也能正常工作,但这不是我正在做的非常基本的样品,你能帮忙吗? 感谢

2 个答案:

答案 0 :(得分:0)

我看到2个问题:

  1. &#34; PrismContentPage1ViewModel&#34;在导航到那里之前不会创建。尝试在&#34; _ea.GetEvent上添加断点
  2. 您想将一些值传递给下一个viewmodel吗?如果是的话,你做错了。使用NavigationParameters
  3. 奖励:不要使用硬编码的视图字符串,例如&#34; PrismContentPage1&#34;。如果你能写nameof。如果您更改视图名称并且导航不再起作用,将会有所帮助,因为您忘记在导航中更改视图名称

答案 1 :(得分:0)

您已收到订阅活动后发布的事件。以前解雇的所有事件都会丢失给您,因为您无法追溯订阅。