PRISM eventAggregator订阅在与筛选器一起使用时并不总是有效



我对事件订阅有一个奇怪的行为

我的构造函数:

public ZoneViewModel(IEventAggregator eventAggregatorInstance, IMessagingService messagingServiceInstance, ICachingService cachingServiceInstance, IShellViewModel shellViewModelInstance, IRaumFeldService raumFeldServiceInstance, string Udn, string Name)
{
eventAggregator = eventAggregatorInstance;
messagingService = messagingServiceInstance;
cachingService = cachingServiceInstance;
shellViewModel = shellViewModelInstance;
raumFeldService = raumFeldServiceInstance;
RoomViewModels = new ObservableCollection<IRoomViewModel>();
ZoneViewModelTracks = new ObservableCollection<ElementBase>();
this.Name = Name != string.Empty ? Name : "UnassignedRooms".GetLocalized();
this.Udn = Udn;
eventAggregator.GetEvent<MuteChangedEvent>().Subscribe(onMuteChanged,
ThreadOption.UIThread, false,
device => device.MediaDevice.Udn == Udn);
GetZoneVolumeCommand.Execute(null);
GetZoneMuteCommand.Execute(null);
GetCurrentTransportActionsCommand.Execute(null);
GetTransportSettingsCommand.Execute(null);
GetMediaInfoCommand.Execute(null);
GetPositionInfoCommand.Execute(null);
}

初始化我的对象时,订阅会起作用,但事件永远不会被激发。我已经检查了发布的事件是否正在启动(事实就是这样(

当我将代码更改为此时(要比较的固定值;该值与用于初始化的值相同(。订阅工作良好

public ZoneViewModel(IEventAggregator eventAggregatorInstance, IMessagingService messagingServiceInstance, ICachingService cachingServiceInstance, IShellViewModel shellViewModelInstance, IRaumFeldService raumFeldServiceInstance, string Udn, string Name)
{
eventAggregator = eventAggregatorInstance;
messagingService = messagingServiceInstance;
cachingService = cachingServiceInstance;
shellViewModel = shellViewModelInstance;
raumFeldService = raumFeldServiceInstance;
RoomViewModels = new ObservableCollection<IRoomViewModel>();
ZoneViewModelTracks = new ObservableCollection<ElementBase>();
this.Name = Name != string.Empty ? Name : "UnassignedRooms".GetLocalized();
this.Udn = Udn;
eventAggregator.GetEvent<MuteChangedEvent>().Subscribe(onMuteChanged,
ThreadOption.UIThread, false,
device => device.MediaDevice.Udn == "MYUDN");
}

替代方案我删除了过滤器,并检查了我的方法,它也很好:

public ZoneViewModel(IEventAggregator eventAggregatorInstance, IMessagingService messagingServiceInstance, ICachingService cachingServiceInstance, IShellViewModel shellViewModelInstance, IRaumFeldService raumFeldServiceInstance, string Udn, string Name)
{
eventAggregator = eventAggregatorInstance;
messagingService = messagingServiceInstance;
cachingService = cachingServiceInstance;
shellViewModel = shellViewModelInstance;
raumFeldService = raumFeldServiceInstance;
RoomViewModels = new ObservableCollection<IRoomViewModel>();
ZoneViewModelTracks = new ObservableCollection<ElementBase>();
this.Name = Name != string.Empty ? Name : "UnassignedRooms".GetLocalized();
this.Udn = Udn;
eventAggregator.GetEvent<MuteChangedEvent>().Subscribe(onMuteChanged,
ThreadOption.UIThread);
GetZoneVolumeCommand.Execute(null);
GetZoneMuteCommand.Execute(null);
GetCurrentTransportActionsCommand.Execute(null);
GetTransportSettingsCommand.Execute(null);
GetMediaInfoCommand.Execute(null);
GetPositionInfoCommand.Execute(null);
}
private void onMuteChanged(RaumFeldEvent args)
{
if (args.MediaDevice.Udn == Udn)
{
// val = "7" />
if (args.ChangedValues.TryGetValue("val", out string currenttrack) && currenttrack != "0")
{
CurrentTrack = Int32.Parse(currenttrack);
}
}
}

你知道问题出在哪里吗?我做错了什么?

感谢

我设法解决了我的问题。我的课是按照创建的

zoneViewModel = PrismUnityApplication.Current.Container.Resolve<ZoneViewModel>(new ResolverOverride[]
{
new ParameterOverride("Udn", zoneRenderer.Udn),
new ParameterOverride("Name", zoneRenderer.Name),
});

我现在改为参数命名如下:

public ZoneViewModel(IEventAggregator eventAggregatorInstance, IMessagingService messagingServiceInstance, ICachingService cachingServiceInstance, IShellViewModel shellViewModelInstance, IRaumFeldService raumFeldServiceInstance, string paramUdn, string paramName)
{
eventAggregator = eventAggregatorInstance;
messagingService = messagingServiceInstance;
cachingService = cachingServiceInstance;
shellViewModel = shellViewModelInstance;
raumFeldService = raumFeldServiceInstance;
RoomViewModels = new ObservableCollection<IRoomViewModel>();
ZoneViewModelTracks = new ObservableCollection<ElementBase>();
this.Name = paramName != string.Empty ? paramName : "UnassignedRooms".GetLocalized();
this.Udn = paramUdn;
eventAggregator.GetEvent<MuteChangedEvent>().Subscribe(onMuteChanged,
ThreadOption.UIThread, false,
device => device.MediaDevice.Udn == Udn);
GetZoneVolumeCommand.Execute(null);
GetZoneMuteCommand.Execute(null);
GetCurrentTransportActionsCommand.Execute(null);
GetTransportSettingsCommand.Execute(null);
GetMediaInfoCommand.Execute(null);
GetPositionInfoCommand.Execute(null);
}
zoneViewModel = PrismUnityApplication.Current.Container.Resolve<ZoneViewModel>(new ResolverOverride[]
{
new ParameterOverride("paramUdn", zoneRenderer.Udn),
new ParameterOverride("paramName", zoneRenderer.Name),
});

现在它起作用了。感谢Haukinger指向正确的方向!

相关内容

最新更新