Radwindow after Catel Update to 5.0

91 Views Asked by At

After upgrading to Catel 5.0, I started getting the exception shown below:

Object of type 'System.EventHandler' cannot be converted to type 'System.EventHandler`1[Telerik.Windows.Controls.WindowClosedEventArgs]'.

at System.RuntimeType.TryChangeType(Object value, Binder binder, CultureInfo culture, Boolean needsSpecialCast) at System.Reflection.MethodBase.CheckArguments(Object[] parameters, Binder binder, BindingFlags invokeAttr, CultureInfo culture, Signature sig) at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at Catel.Services.UIVisualizerService.HandleCloseSubscription(Object window, Object data, EventHandler`1 completedProc, Boolean isModal) in C:\CI_WS\Ws\103722\Source\Catel\src\Catel.MVVM\Catel.MVVM.Shared\Services\UIVisualizerService.wpf.cs:line 141 at Catel.Services.UIVisualizerService.ShowWindowAsync(FrameworkElement window, Object data, Boolean showModal) in C:\CI_WS\Ws\103722\Source\Catel\src\Catel.MVVM\Catel.MVVM.Shared\Services\UIVisualizerService.wpf.cs:line 155 at Catel.Services.UIVisualizerService.d__15.MoveNext() in C:\CI_WS\Ws\103722\Source\Catel\src\Catel.MVVM\Catel.MVVM.Shared\Services\UIVisualizerService.cs:line 222 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

I have basically setup all windows(Message box, model window and main shell) to inherit from Radwindow while implementing the IDatawindow interface and it occurs when I attempt to utilize "IUIVisualizerService". Below is a sample:

public class MessageService : Catel.Services.MessageService, IAppMessageService
{...
public MessageService(IDispatcherService dispatcherService, IUIVisualizerService uiVisualizerService, IViewModelFactory viewModelFactory)
        : base(dispatcherService)
    {
        Argument.IsNotNull(() => dispatcherService);
        Argument.IsNotNull(() => uiVisualizerService);
        Argument.IsNotNull(() => viewModelFactory);

        this._dispatcherService = dispatcherService;
        this._uiVisualizerService = uiVisualizerService;
        this._viewModelFactory = viewModelFactory;
    }
public override Task<MessageResult> ShowAsync(string message, string caption = "", MessageButton button = MessageButton.OK, MessageImage icon = MessageImage.None)
    {...
this._dispatcherService.BeginInvoke(async () =>
        {
            var previousCursor = Mouse.OverrideCursor;
            Mouse.OverrideCursor = null;

            var vm = this._viewModelFactory.CreateViewModel<MessageBoxViewModel>(null, null);

            vm.Message = message;
            vm.Button = button;
            vm.Icon = icon;
            vm.SetTitle(caption);

            await this._uiVisualizerService.ShowDialogAsync(vm);

The error occurs when attempting to show the dialog as shown above.

I'm using the exact samples provided from Orchestra source code:

private readonly WindowLogic _logic;
    private event EventHandler<EventArgs> ViewLoaded;
    private event EventHandler<EventArgs> ViewUnloaded;
    private event EventHandler<DataContextChangedEventArgs> ViewDataContextChanged;
    private event EventHandler<WindowClosedEventArgs> ViewClosed;

    public AppMessageBoxWindow() : this(null) { }

    public AppMessageBoxWindow(IViewModel viewModel)
    {
        GetAndSetIcon();
        this.FixBlurriness();
        this.SizeToContent = true;
        this.ResizeMode = ResizeMode.NoResize;
        this.WindowStartupLocation = WindowStartupLocation.CenterOwner;

        this._logic = new WindowLogic(this, null, viewModel);
        this._logic.ViewModelChanged += (sender, args) => ViewModelChanged.SafeInvoke(this, args);
        this._logic.PropertyChanged += (sender, args) => PropertyChanged.SafeInvoke(this, args);
        this._logic.ViewModelPropertyChanged += (sender, e) => ViewModelPropertyChanged.SafeInvoke(this, e);

        Loaded += (sender, args) => ViewLoaded.SafeInvoke(this, args);
        Unloaded += (sender, args) => ViewUnloaded.SafeInvoke(this);
        DataContextChanged += (sender, e) => ViewDataContextChanged.SafeInvoke(this, new DataContextChangedEventArgs(e.OldValue, e.NewValue));

        OnViewModelChanged();
    }

    public IViewModel ViewModel => this._logic.ViewModel;
    private void GetAndSetIcon()
    {
        this.Icon = new Image { Source = new BitmapImage(ImagesUri.AppIcon) };
    }
    public event PropertyChangedEventHandler PropertyChanged;
    public event EventHandler<EventArgs> ViewModelChanged;
    public event EventHandler<PropertyChangedEventArgs> ViewModelPropertyChanged;
    event EventHandler<EventArgs> IView.Loaded
    {
        add { ViewLoaded += value; }
        remove { ViewLoaded += value; }
    }
    event EventHandler<EventArgs> IView.Unloaded
    {
        add { ViewUnloaded += value; }
        remove { ViewUnloaded += value; }
    }
    event EventHandler<DataContextChangedEventArgs> IView.DataContextChanged
    {
        add { ViewDataContextChanged += value; }
        remove { ViewDataContextChanged += value; }
    }
    private void OnViewModelChanged()
    {
        if (ViewModel != null && !ViewModel.IsClosed)
        {
            ViewModel.ClosedAsync += ViewModelClosed;
        }
    }
    private Task ViewModelClosed(object sender, ViewModelClosedEventArgs e)
    {
        Close();
        return TaskHelper.Completed;
    }
        }

Looks like this may be occurring in the handling of the close event in the UIVisualizerService.

1

There are 1 best solutions below

0
Geert van Horrik On

This is probably a bug caused by the new implementation of the WeakEventListener. Please report this issue with a repro (without any 3rd party libraries) at https://github.com/catel/catel