2

したがって、基本的には、別のcsファイルで定義されたMainWindowクラスと、別のcsファイルに別のクラスがあります。とにかくfromで操作を呼び出すことができるのではないかと思っています。詳細は以下のとおりです。SetupViewModelImageViewModelMainWindowImageViewModel

  • ImageViewModel で、次のように MainWindow の変更を呼び出します (次のコードMainWindow)。

    this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
                    new Action(
                        delegate()
                        {
                                ((SetupViewModel)this.DataContext).ViewType = Convert.ToInt32(ViewTypes.ViewType2D);
                        }
                    )
                );
    
  • ViewType 変数は次のように定義されSetupViewModelています

    private int _viewType;
        public int ViewType
        {
            get
            {
                return _viewType;
            }
            set
            {
                _viewType = value;
                OnPropertyChanged("ViewType");
            }
        }
    
  • これが私がやった方法ですが、成功しませんでした。の呼び出しコードImageViewModel:

    { Action SwitchTo2DView = delegate() { ((CaptureSetupViewModel)System.Windows.Application.Current.MainWindow.DataContext).ViewType = Convert.ToInt32(ViewTypes.ViewType2D); を試してください。};

                System.Windows.Application.Current.MainWindow.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, SwitchTo2DView);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Caught exception: " + ex.ToString());
            }
    

そして例外:

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at CaptureSetupDll.ViewModel.LiveImageViewModel.<StartZStackPreview>b__2c()
   --- End of inner exception stack trace ---
   at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
   at System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
   at System.Delegate.DynamicInvokeImpl(Object[] args)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
   at System.Threading.ExecutionContext.runTryCode(Object userData)
   at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   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& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Boolean isSingleParameter)
   at System.Windows.Threading.Dispatcher.Invoke(DispatcherPriority priority, Delegate method, Object arg)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   at System.Windows.Threading.DispatcherOperation.Wait(TimeSpan timeout)
   at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Boolean isSingleParameter)
   at System.Windows.Threading.Dispatcher.Invoke(DispatcherPriority priority, Delegate method)
   at CaptureSetupDll.ViewModel.LiveImageViewModel.StartZStackPreview()

私は C# の素人です。どうすればこれを機能させることができますか?どうもありがとう。

4

1 に答える 1

3

これが呼び出された時点で DataContext が null であることは間違いありません。これは、おそらく呼び出されるのが早すぎることを意味します。これはおそらく、何をしていても Dispatcher にプッシュする必要があることを意味します。

このメソッドが呼び出された時点でアプリケーションが完全にロードされていると想定するかもしれませんが、必ずしもそうではありません。これをテストするには、デバッグ中にブレークポイントを設定し、DataContextnull かどうかを確認します。

null の場合は、2 つの選択肢があります。まず、戻るだけです。メソッドの呼び出し方法によっては、ロード中に複数回呼び出される場合があります。後で呼び出すと、null 以外のコンテキストが明らかになる場合があります。

もう 1 つのオプションは、アプリケーションがロードされた後でDispatcherを使用してメソッドを再呼び出しすることです。

これは、C# に似ていて、コンパイルすることもできる小さな疑似コードです。

public void CheckTheDataContext()
{
    // is it null?
    if(this.DataContext == null)
    {
        // then drop an Action re-invoking this method later
        // when the application idles out a bit
        Dispatcher.BeginInvoke((Action)(() =>
        {
            CheckTheDataContext();
        }), System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        return;
    }
    DoSomethingElseWithTheContext(DataContext);
}
于 2013-05-07T19:23:19.107 に答える