Syncfusion sfDatagrid

时间:2015-11-28 06:59:56

标签: entity-framework-6 catel syncfusion

我创建了一个使用Catel,Entity Framework 6和Syncfusion Community Edition的项目。具体来说,我使用的是Syncfusion的sfDataGrid。

我遇到了一个让我完全难过的问题,也许有人可能会指出我正确的方向。

我有一个带有sfDataGrid的Catel UserControl。 ViewModel有一个我正在使用的数据的ObservableCollection(Catel属性)作为sfDataGrid的ItemsSource。我在sfDataGrid上启用了过滤功能。这是sfDataGrid的代码:

<sync:SfDataGrid
                x:Name="ItemsDataGrid"
                ItemsSource="{Binding MyItems, Mode=OneWay}"
                SelectedItem="{Binding MyItem, Mode=TwoWay}"
                AutoGenerateColumns="False"
                AllowFiltering="True"
                AllowResizingColumns="True"
                GridCopyOption="IncludeHeaders"
                GridPasteOption="None"
                ShowGroupDropArea="True"
                ShowRowHeader="True"
                DataFetchSize="50">
<!-- Columns -->
</sync:SfDataGrid>

我在另一个视图上向集合中添加一个新项目,然后将其保存到datacontext并刷新列表:

private async void OnNewMyItemExecute()
        {
            MyItem= new MyItem();

            MyItemsRepository.Add(MyItem);

            var myItemsViewModel = TypeFactory
                .Default
                .CreateInstanceWithParametersAndAutoCompletion<myItemsViewModel >(MyItem); //the construction has parameters for IUIVisualizerService, IPleaseWaitService, etc.

            if (await _UIVisualizerService.ShowDialogAsync(myItemsViewModel) ?? true)
            {
                var myItem= myItemsViewModel.MyItem;

                await InitializeAsync();

                MyItem = myItem;
            }
            else
            {
                _UnitOfWorkService.Rollback(); //just undo some changes
                MyItem = null;
            }

            UnitOfWork.SaveChanges();
        }

创建一个新项目根本不是问题,奇怪之处在于我创建了一个新项目然后尝试在sfDataGrid的任何列上过滤网格(单击列标题中的过滤器按钮,过滤器弹出窗口打开,在条件文本框中输入一个值,然后单击“确定”,我明白了:

  

MyProject.vshost.exe警告:0:17:57:49:075 =&gt; [警告]   [Catel.Services.UIVisualizerService] [8]发生错误,返回   因为我们不知道结果,所以null [TargetInvocationException]   System.Reflection.TargetInvocationException:抛出了异常   通过调用的目标。 ---&GT;   System.Reflection.TargetInvocationException:抛出了异常   通过调用的目标。 ---&GT; System.InvalidCastException:   无法转换类型&#39; MyProject.Domain.MyItem&#39;输入   &#39; System.Data.Entity.DynamicProxies.MyItem_4CA6F59AB53174892ED9EFBC1D3CC07B862579FC3C5733C6CF4DE857907CFF9C&#39 ;.   在lambda_method(Closure,MyItem)---内部异常结束   堆栈跟踪---在System.RuntimeMethodHandle.InvokeMethod(对象   target,Object [] arguments,Signature sig,Boolean constructor)at   System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj,   Object []参数,Object []参数)at   System.Delegate.DynamicInvokeImpl(Object [] args)at   System.Delegate.DynamicInvoke(Object [] args)at   Syncfusion.Data.QueryableCollectionView&LT;&GT; c__DisplayClass3.b__1(对象   o)在Syncfusion.Data.QueryableCollectionView.FilterRecord(Object   记录)   Syncfusion.Data.EnumerableRecordsWrapper..ctor(IEnumerable source,   CollectionViewAdv查看)   Syncfusion.Data.EnumerableRecordsWrapper.CreateNew(IEnumerable source,   CollectionViewAdv查看)   Syncfusion.Data.QueryableCollectionView.CreateRecords()at   Syncfusion.Data.CollectionViewAdv.EnsureInitialized()at   Syncfusion.Data.CollectionViewAdv.get_Records()at   Syncfusion.Data.CollectionViewAdv.EnsureRecordsInitialized()at   Syncfusion.Data.CollectionViewAdv.Refresh()at   Syncfusion.Data.QueryableCollectionView.RefreshFilter()at   Syncfusion.Data.CollectionViewAdv.ApplyFilters()at   Syncfusion.Data.CollectionViewAdv.set_FilterPredicates(ObservableCollection 1 value) at Syncfusion.UI.Xaml.Grid.GridModel.FilterColumn(GridColumn column, List 1 filterPredicates)at at   Syncfusion.UI.Xaml.Grid.GridFilterControl.RefreshFilter()at   Syncfusion.UI.Xaml.Grid.GridFilterControl.b__10(对象   s,RunWorkerCompletedEventArgs e)at   System.ComponentModel.BackgroundWorker.OnRunWorkerCompleted(RunWorkerCompletedEventArgs   吃   System.ComponentModel.BackgroundWorker.AsyncOperationCompleted(对象   arg)at   System.Windows.Threading.ExceptionWrapper.InternalRealCall(代表   回调,对象args,Int32 numArgs)at   System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source,   委托回调,Object args,Int32 numArgs,Delegate catchHandler)   在System.Windows.Threading.DispatcherOperation.InvokeImpl()at   System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(对象   国家)   System.Threading.ExecutionContext.RunInternal(执行上下文   executionContext,ContextCallback回调,对象状态,布尔值   preserveSyncCtx)at   System.Threading.ExecutionContext.Run(执行上下文   executionContext,ContextCallback回调,对象状态,布尔值   preserveSyncCtx)at   System.Threading.ExecutionContext.Run(执行上下文   executionContext,ContextCallback回调,对象状态)at   System.Windows.Threading.DispatcherOperation.Invoke()at   System.Windows.Threading.Dispatcher.ProcessQueue()at   System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd,Int32   msg,IntPtr wParam,IntPtr lParam,Boolean&amp;处理)   MS.Win32.HwndWrapper.WndProc(IntPtr hwnd,Int32 msg,IntPtr wParam,   IntPtr lParam,Boolean&amp;处理)   MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)at   System.Windows.Threading.ExceptionWrapper.InternalRealCall(代表   回调,对象args,Int32 numArgs)at   System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source,   委托回调,Object args,Int32 numArgs,Delegate catchHandler)   在   System.Windows.Threading.Dispatcher.LegacyInvokeImpl(的DispatcherPriority   优先级,TimeSpan超时,委托方法,对象args,Int32   numArgs)在MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd,   Int32 msg,IntPtr wParam,IntPtr lParam)at   MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG&amp; msg)at at   System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame   框架)   System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame框架)
  在System.Windows.Window.ShowHelper(Object booleanBox)at   System.Windows.Window.ShowDialog()中的System.Windows.Window.Show()   ---内部异常堆栈跟踪的结束---在System.RuntimeMethodHandle.InvokeMethod(Object target,Object []   参数,签名sig,布尔构造函数)at   System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj,   Object []参数,Object []参数)at   System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags   invokeAttr,Binder binder,Object []参数,CultureInfo文化)
  在System.Reflection.MethodBase.Invoke(Object obj,Object []   参数)at   Catel.Services.UIVisualizerService&LT;&GT; c__DisplayClass23_0.b__0()   在   C:\ CI_WS \ Ws的\ 86058 \来源\ Catel的\ src \ Catel.MVVM \ Catel.MVVM.Shared \ SERVICES \ UIVisualizerService.cs:行   499

这是使用Line 499的UIVisualizerService的方法:

protected virtual bool? ShowWindow(FrameworkElement window, bool showModal)
        {
            if (showModal)
            {
                var showDialogMethodInfo = window.GetType().GetMethodEx("ShowDialog");
                if (showDialogMethodInfo != null)
                {
                    // Child window does not have a ShowDialog, so not null is allowed
                    bool? result = null;

                    window.Dispatcher.InvokeIfRequired(() =>
                    {
                        // Safety net to prevent crashes when this is the main window
                        try
                        {
                            result = showDialogMethodInfo.Invoke(window, null) as bool?; //Line 499
                        }
                        catch (Exception ex)
                        {
                            Log.Warning(ex, "An error occurred, returning null since we don't know the result");
                        }
                    });

                    return result;
                }

                Log.Warning("Method 'ShowDialog' not found on '{0}', falling back to 'Show'", window.GetType().Name);
            }

我尝试使用.ShowAsync(),。ShowDialogAsync()打开MyItemsView,在我升级到Catel 4.4之前,我也使用了.ShowDialog(),但它没有任何区别。我可以在EF中关闭代理创建,但这会导致我在项目中进行很多更改(不再为我添加延迟加载,这不是一个选项)。我确实认为问题是我添加的新项目不是动态代理,并且让它成为动态代理可能会解决问题,但我已经尝试再次从DbContext加载所有数据,但它也无法解决问题。

任何建议都将受到赞赏。

1 个答案:

答案 0 :(得分:2)

问题在于:

System.InvalidCastException: Unable to cast object of type 'MyProject.Domain.MyItem' to type 'System.Data.Entity.DynamicProxies.MyItem_4CA6F59AB53174892ED9EFBC1D3CC07B862579FC3C5733C6CF4DE857907CFF9C'. 

当然,原因是你试图将基类型转换为派生类型(它根本就不是)。这最终导致窗口关闭是因为异常发生,但这不是真正的问题。

此异常发生在网格的FilterRecord方法中。我不确定这是你自己写的东西还是同步内的东西,但这是值得一看的地方。

您生成代理的原因是您启用了(或默认情况下已启用)Entity Framework DbContext的代理生成。