2014-04-09 2 views
0

MainPage 클래스 외부에서 버튼 클릭 이벤트를 관리해야하는 상황이 있습니다 (클래스 B에서 가정). 다음은 내가 사용하고있는 코드입니다.MainPage 클래스 외부에서 이벤트 수신 버튼 클릭 이벤트에서 여러 번 호출하는 메소드 (반복적으로)

namespace TEST 
{ 
    public partial class MainPage: UserControl 
    { 
     public event Action simpleEvent; 
     public MainPage() 
     {  
     } 

     private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      switch (comboBox1.SelectedItem as string) 
      { 
      case "UInt8": 
       B obj4 = new B(this, fileContent, "UInt8"); 
       break; 
      case "UInt16": 
       B obj1 = new B(this, fileContent, "UInt16"); 
       break; 
      case "UInt32": 
       B obj2 = new B(this, fileContent, "UInt32"); 
       break; 
      case "UInt64": 
       B obj3 = new B(this, fileContent, "UInt64"); 
       goto 
      default; 
      default: 
       MessageBox.Show("check"); 
       break; 
      } 
     } 
     private void ButtonClick_EVENT(object sender, RoutedEventArgs e) 
     { 
      // I try to listen outside the class this way. 
      if (simpleEvent != null) 
       simpleEvent(); 
     } 
    } 

    Class B 
    { 
     public B(MainPage Obj, byte[] fileContent, string type) 
     { 
      switch (type = Obj.comboBox1.SelectedItem as string) 
      { 
      case "UInt8": 
       { 
        //do something 
        break; 
       } 
      case "UInt16": 
       { 
        //do something 
        break; 
       } 
      case "UInt32": 
       { 
        //do something 
        break; 
       } 

      case "UInt64": 
       { 
        //do something 
        goto 
        default; 
       } 
      default: 
       { 
        break; 
       } 


      } 
      Obj.simpleEvent +=() = > MyMethod(Obj); 
     } 

     public void MyMethod(MainPage Obj) 
     { 
      // This MessageBox repeats 2 times on second time button click 
      // and 3 times on 3rd button click . 
      // It should be called once even on second/third/fourth etc. button clicks. 
      MessageBox.Show("Repetition check"); 
     } 
    } 
} 

문제는 내 메서드가 반복적으로 호출된다는 것입니다. 예를 들어 처음 버튼을 한 번만 클릭하면 (이는 좋은 것입니다). 버튼을 다시 클릭하면 메시지 상자 팝업이 2 번 나타나고 다시 3 번 팝업으로 3 번 팝업됩니다.

내가 원하는 것은이 메시지 상자를 한 번만 클릭하여 팝업으로 표시하는 것입니다 (다른 클릭 후 하나의 버튼을 계속 클릭하더라도).

편집 : 새롭게 업데이트 된 코드는 코드를 짧게 만들려고 시도한 실제 상황입니다. (내가 그 부분을 의심하지 않았기 때문에) 많은 코드를 포함하지 않았습니다.

무엇을하려고합니까 : 런타임에 4 개의 주어진 데이터 유형 (uint64/32/16/8) 중에서 하나의 데이터 유형을 선택해야합니다 (파일을 읽는 데 사용할 데이터 유형 ("fileContent "생성자 호출에서),하지만 내가 물어 질문에 관련이 너무 많은 토론을 떠난다.) 그 데이터 형식을 선택하면 난 button 뭔가를 표시하려면 클릭하십시오. (그래서 내가 처음에 "데이터 형식"을 combo box에서 선택하고 나서 해당 데이터 유형에 해당하는 일부 데이터를 표시하려면 button을 누른 다음 콤보 상자에서 다른 데이터 유형을 선택하고 다시 "버튼"을 누릅니다. 그러나 이번에는 팝업 메시지 2 번, 그리고 같은 세 번째 시간을 반복 할 때 팝업 메시지 박스 3 회).

첫 번째 시도에서 콤보 상자에서 (첫 번째 시도에서) 콤보 상자를 선택한 다음 메시지 상자를 표시하기 위해 단추를 클릭하면 메시지 상자가 once.Now 응용 프로그램을 두 번째 선택 항목을 닫지 않고 팝업됩니다. 콤보 상자가 uint32 (두 번째 시도시)에 있으며이 메시지 상자가 두 번 튀어 나오는 "단추"를 다시 클릭합니다. 왜 그런지 몰라? 3 번 시도하면 3 번 팝업됩니다.

(1) 왜 메시지 상자가 반복됩니까? 사전에 도움을 주셔서 감사합니다, 나는 정말로 그 이유를 알고 싶습니다. 아직 이해할 수 없습니다.

+1

이것은 멀티 캐스트 대리인 문제처럼 보입니다. SimpleEvent에 여러 번 'MyMethod()'를 추가해야합니다. B 클래스 생성자에 simpleEvenyt가 추가되기 전에 null이 아닌지 확인하는 이유는 무엇입니까? – KillaKem

+0

표시된 코드는이 문제를 재현하지 않습니다. 각 이벤트에 처리기를 정확히 한 번 추가합니다. 실제 코드가 여기에 게시 한 코드와 약간 다른 것 같습니다. – Servy

+1

우연히 클래스 레벨에서 한 번뿐 아니라 'B'라는 새로운 인스턴스를 버튼 클릭 이벤트에 인스턴스화합니까? –

답변

2

콤보 상자가 바뀔 때마다 새로운 B 개체가 생성됩니다. 이는 이전 핸들러를 제거하지 않고 매번 새로운 핸들러를 추가합니다. 새 핸들러를 추가 할 때 이전 핸들러를 등록 해제하거나 하나의 핸들러 만 추가하고 의존하는 데이터를 수정하면 핸들러가 시작될 때 핸들러가 적절하게 작동해야합니다.

+0

이전 처리기를 구독 취소하는 방법은 무엇입니까? – Sss

+1

@ user234839'something.SomeEvent - = handlerToRemove; ' – Servy

+0

고맙습니다. 이전 처리기를 구독 취소하는 방법은 무엇입니까? 특별히 코드의이 상황에서 – Sss