【发布时间】:2017-08-18 22:01:51
【问题描述】:
升级到 Catel 5.0 后,我开始出现如下异常:
“System.EventHandler”类型的对象无法转换为“System.EventHandler`1[Telerik.Windows.Controls.WindowClosedEventArgs]”类型。
在 System.RuntimeType.TryChangeType(Object value, Binder binder, CultureInfoculture, Boolean needsSpecialCast) 在 System.Reflection.MethodBase.CheckArguments(Object[] 参数,Binding 活页夹,BindingFlags invokeAttr,CultureInfo 文化,签名 sig) 在 System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj,BindingFlags invokeAttr,Binder binder,Object[] 参数,CultureInfo 文化) 在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object[] 参数,CultureInfo 文化) 在 C:\CI_WS\Ws\103722\Source\Catel\src\Catel.MVVM\Catel.MVVM.Shared\Services 中的 Catel.Services.UIVisualizerService.HandleCloseSubscription(对象窗口,对象数据,EventHandler`1 completedProc,布尔 isModal) \UIVisualizerService.wpf.cs:第 141 行 在 C:\CI_WS\Ws\103722\Source\Catel\src\Catel.MVVM\Catel.MVVM.Shared\Services\UIVisualizerService.wpf 中的 Catel.Services.UIVisualizerService.ShowWindowAsync(FrameworkElement 窗口,对象数据,布尔 showModal)。 CS:第 155 行 在 C:\CI_WS\Ws\103722\Source\Catel\src\Catel.MVVM\Catel.MVVM.Shared\Services\UIVisualizerService.cs:line 222 中的 Catel.Services.UIVisualizerService.d__15.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在实现 IDatawindow 接口时,我基本上已将所有窗口(消息框、模型窗口和主 shell)设置为从 Radwindow 继承,当我尝试使用“IUIVisualizerService”时会发生这种情况。下面是一个示例:
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);
尝试显示如上所示对话框时发生错误。
我正在使用 Orchestra 源代码中提供的确切示例:
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;
}
}
看起来这可能是在 UIVisualizerService 中处理关闭事件时发生的。
【问题讨论】:
标签: c# wpf mvvm catel radwindow