我对事件订阅有一个奇怪的行为
我的构造函数:
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指向正确的方向!