xamarin.forms - Container.Resolve 上的棱镜空异常()
问题描述
行 Resources.Add("eventAggregator", Container.Resolve()); 引发空异常。
更新 我添加了所有类来解释更多。正如@Axemasta 所说,无需注册 IEventAggregator 并且我删除了注册。现在我不知道如何将 Listview EventAggregator 行为连接到 EventAggregator。
这是整个 App.xaml 代码文件。
public partial class App : PrismApplication
{
/*
* The Xamarin Forms XAML Previewer in Visual Studio uses System.Activator.CreateInstance.
* This imposes a limitation in which the App class must have a default constructor.
* App(IPlatformInitializer initializer = null) cannot be handled by the Activator.
*/
public App() : this(null) { }
public App(IPlatformInitializer initializer) : base(initializer) { }
protected override async void OnInitialized()
{
InitializeComponent();
Resources.Add("eventAggregator", Container.Resolve<IEventAggregator>());// Removed on update
FlowListView.Init();
await NavigationService.NavigateAsync("NavigationPage/MainPage");
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation<NavigationPage>();
containerRegistry.RegisterForNavigation<MainPage>();
}
}
}
行为类:
public class ScrollToMyModelBehavior : BehaviorBase<ListView>
{
private IEventAggregator _eventAggregator;
public IEventAggregator EventAggregator
{
get => _eventAggregator;
set
{
if (!EqualityComparer<IEventAggregator>.Default.Equals(_eventAggregator, value))
{
_eventAggregator = value;
_eventAggregator.GetEvent<ScrollToMyModelEvent>().Subscribe(OnScrollToEventPublished);
}
}
}
private void OnScrollToEventPublished(ListItem model)
{
AssociatedObject.ScrollTo(model, ScrollToPosition.Start, true);
}
protected override void OnDetachingFrom(ListView bindable)
{
base.OnDetachingFrom(bindable);
// The Event Aggregator uses weak references so forgetting to do this
// shouldn't create a problem, but it is a better practice.
EventAggregator.GetEvent<ScrollToMyModelEvent>().Unsubscribe(OnScrollToEventPublished);
}
}
事件类:
public class ScrollToMyModelEvent : PubSubEvent<ListItem>
{
}
页面视图模型:
public MainPageViewModel(INavigationService navigationService, IEventAggregator eventAggregator)
: base (navigationService)
{
Title = "صفحه اصلی";
ListHeight = 100;
ListWidth = 250;
_eventAggregator = eventAggregator;
Items items = new Items();
ListViewItemSouce = items.GetItems();
MyModels = items.GetItems();
SelectedModel = ListViewItemSouce[3];
_eventAggregator.GetEvent<ScrollToMyModelEvent>().Publish(SelectedModel);
}
页面视图:
<StackLayout HorizontalOptions="Center" VerticalOptions="Center" WidthRequest="{Binding ListWidth}" HeightRequest="{Binding ListHeight}"
Grid.Row="1" Grid.Column="1">
<local:NativeListView x:Name="lst3" ItemsSource="{Binding ListViewItemSouce}" Margin="1" BackgroundColor="Transparent" RowHeight="47" HasUnevenRows="false">
<ListView.Behaviors>
<local:ScrollToMyModelBehavior EventAggregator="{StaticResource eventAggregator}" /> // Error raised that there is not such a static property
</ListView.Behaviors>
<ListView.ItemTemplate>
<DataTemplate>
<TextCell Text="{Binding Word}" TextColor="Black"/>
</DataTemplate>
</ListView.ItemTemplate>
</local:NativeListView>
</StackLayout>
解决方案
应用程序初始化时无需注册IEventAggregator
,就像INavigationService
或一样IPageDialog
,开箱即用!
要使用EventAggregator
,您应该执行以下操作:
创建活动
您首先需要创建一个事件(使用 Prism),您可以将其传递给EventAggregator
. 您的事件应该继承自PubSubEvent
,您可以将其传递给对象(可选)。因此,您的活动将如下所示:
using System;
using Prism.Events;
namespace Company.App.Namespace.Events
{
public class SampleEvent : PubSubEvent
{
}
}
查看最近的一个应用程序,我最常在自定义弹出视图(如参数字典)之间传递数据时使用它。
订阅活动
触发时IEventAggregator
,订阅该事件的任何内容都将执行指定的任何代码。在您想收到事件的课程中,您必须执行以下操作:
- 通过构造函数传递类
IEventAggregator
(prism 毕竟是 DI) - 初始化一个本地
IEventAggregator
以在此类中使用 - 订阅
IEventAggregator
处理程序方法。
下面是代码的样子:
public class TheClassListeningForAnEvent
{
private readonly IEventAggregator _eventAggregator;
public TheClassListeningForAnEvent(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
_eventAggregator.GetEvent<SampleEvent>().Subscribe(OnEventRecieved);
}
void OnEventRecieved()
{
//Do something here
}
}
触发事件
现在您已经注册了该事件,您可以触发该事件。将 传递IEventAggregator
到要从中触发事件的任何类中并使用Publish Method
:
public class TheClassPublishingAnEvent
{
private readonly IEventAggregator _eventAggregator;
public TheClassListeningForAnEvent(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
_eventAggregator.GetEvent<SampleEvent>().Publish();
}
}
这就是它的长处和短处。你可以将任何东西传递给IEventAggregator
,你只需要在你订阅的方法中处理这个。
希望这足以让你继续使用IEventAggregator
!
推荐阅读
- python-2.7 - pb nagios python 返回空值
- javascript - 运行应用程序时如何解决以下错误:无法解析所有文件进行配置?
- jquery - 无法使用 Jquery datetimepicker 格式化所选日期时间
- android - Android,MediaPlayer 在随机次数后崩溃
- angular-material - 您推荐使用哪些工具来代替 mat-grid-list?
- css - 在公共页面和管理仪表板之间拆分基本样式表
- python - Django查询通过外键关系获取属于特定对象的所有表单集图像
- c# - OWIN - 如何在身份验证服务器返回后验证角色的不记名令牌?
- c# - 使对象在立方体统一的 6 面上移动
- c++ - 当简单捕获中的标识符显示为参数的声明符 ID 时,没有编译器诊断