我试图使用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)也能正常工作,但这不是我正在做的非常基本的样品,你能帮忙吗? 感谢
答案 0 :(得分:0)
我看到2个问题:
奖励:不要使用硬编码的视图字符串,例如&#34; PrismContentPage1&#34;。如果你能写nameof。如果您更改视图名称并且导航不再起作用,将会有所帮助,因为您忘记在导航中更改视图名称
答案 1 :(得分:0)
您已收到订阅活动后发布的事件。以前解雇的所有事件都会丢失给您,因为您无法追溯订阅。