Exceptions thrown in ActivateItemAsync, including all other methods called from the default implementation (TryDeactivateAsync, TryActivateAsync, NotifyOfPropertyChange, OnActivationProcessed) are silently discarded.
Repro:
public class MainViewModel : Conductor<Model>.Collection.OneActive
{
public MainViewModel()
{
Items.AddRange(new []
{
new Model(),
new Model(),
new Model(),
});
}
public override Task ActivateItemAsync(Model item, CancellationToken cancellationToken = new CancellationToken())
{
throw new Exception("please notice me");
}
}
When selecting an item in a WPF ListBox, nothing happens. This is especially bad if there is additional code after the exception, which is simply not being executed without any indication.
I've found a similar issue #745 which is probably related.
The reason is that the setter of ActiveItem calls ActivateItemAsync without awaiting the task. This is a regression from 3.x. I realize awaiting in a setter is not possible and this might be a design issue:
|
set => ActivateItemAsync(value, CancellationToken.None); |
Exceptions thrown in
ActivateItemAsync, including all other methods called from the default implementation (TryDeactivateAsync,TryActivateAsync,NotifyOfPropertyChange,OnActivationProcessed) are silently discarded.Repro:
When selecting an item in a WPF ListBox, nothing happens. This is especially bad if there is additional code after the exception, which is simply not being executed without any indication.
I've found a similar issue #745 which is probably related.
The reason is that the setter of
ActiveItemcallsActivateItemAsyncwithout awaiting the task. This is a regression from 3.x. I realize awaiting in a setter is not possible and this might be a design issue:Caliburn.Micro/src/Caliburn.Micro.Core/ConductorBaseWithActiveItem.cs
Line 20 in 145c480