0

イベント/デリゲートをいじっていますが、常に次のエラーが発生します:

型 'System.Reflection.TargetInvocationException' の未処理の例外が PresentationFramework.dll で発生しました

追加情報: 呼び出しのターゲットによって例外がスローされました。

私のコードは次のとおりです。

namespace Test
{
    using System;
    using System.Windows;

    public partial class TestWindow : Window
    {
        public TestWindow()
        {
            this.InitializeComponent();

            this.TestEvent(this, new EventArgs());
        }

        public delegate void TestDelegate(object sender, EventArgs e);

        public event TestDelegate TestEvent;
    }
}

明らかに、別の場所に TestWindow オブジェクトを開くためのコードがあります。

TestWindow testWindow = new TestWindow();

testWindow.TestEvent += this.TestMethod;

と:

private void TestMethod(object sender, EventArgs e)
{
}
4

2 に答える 2

1

つまり、ウィンドウの初期化中にコンストラクターでイベントを呼び出しているため、TestEventその時点では は null です。の null チェックを追加しTestEvent、コンストラクター以外のメソッドで呼び出してTestEvent、 にサブスクライバーが割り当てられているかどうか、つまり null でないかどうかを確認します。

編集:

デモ用のコードを次に示します。

public partial class TestWindow : Window
    {
        public TestWindow()
        {
            this.InitializeComponent();
            //don't publish event in constructor, since the event yet to have any subscriber
            //this.TestEvent(this, new EventArgs());
        }

        public void DoSomething()
        {
            //Do Something Here and notify subscribers that something has been done
            if (TestEvent != null)
            {
                TestEvent(this, new EventArgs());
            }
        }
        public delegate void TestDelegate(object sender, EventArgs e);

        public event TestDelegate TestEvent;
    }
    public class Subscriber
    {
        public Subscriber(TestWindow win)
        {
            win.TestEvent += this.TestMethod;
        }

        private void TestMethod(object sender, EventArgs e)
        {
            //Do something when the event occurs
        }
    }
于 2013-12-27T05:28:56.920 に答える
-1

メソッド呼び出しの前に次の行がありません

   TestEvent += new TestDelegate(TestMethod);

コンストラクター内の正しいコードは次のようになります。

 public TestWindow()
        {
            this.InitializeComponent();

            TestEvent += new TestDelegate(TestMethod);

            this.TestEvent(this, new EventArgs());
        }
于 2013-12-27T04:47:00.400 に答える