2010-11-25 3 views
5

현재 창의 모든 컨트롤 (데이터 바인딩 또는 포함하지 않음)을 "수정"하는 일반적인 방법을 찾으려고합니다. 예를 들어 현재 응용 프로그램에서 적용 단추를 사용하거나 사용하지 않도록 설정할 수 있습니다. 사실, 그냥 ComboBox.SelectionChanged 또는 TextBox.TextChanged와 같은 몇 가지 이벤트 처리기를 연결해야합니다. WinForms에서 나는 폼의 모든 컨트롤을 순환 시켜서 하나씩 이벤트를 연결해야했습니다. WPF에서, 나는 MyCtrl의 모든 콤보에 대한 comobobox의 선택 변경된 이벤트를 연결할 수있을 것입니다, 내가이 한 줄의 코드로WPF RoutedEvent (EventManager.RegisterClassHandler를 통해)

EventManager.RegisterClassHandler(typeof(MyCtrl) 
           , ComboBox.SelectionChangedEvent 
           , new RoutedEventHandler(OnChanged)); 

처럼 훨씬 적은 코드로 끝낼 수 있다고 생각. 그러나, 내가 만난 문제는, 올바르게 보았을 때, 콤보 박스가 아닌 "Selector"에서 파생 된 또 다른 컨트롤이있는 경우에도이 이벤트가 발생한다는 것입니다. 예를 들어 같은 창에 데이터 격자가 있습니다. 실제로 데이터 그리드에는 콤보 상자 열이 없습니다. 다른 행을 선택하면이 이벤트가 발생합니다.

그래서 위의 코드 줄은 combobox가 아닌 Selector에서 파생 된 모든 컨트롤에 대해 SelectionChanged 이벤트를 연결하는 것으로 보입니다.

이게 맞습니까? 모든 combobox에 대해 SelectionChanged 이벤트를 연결하려면 어떻게해야합니까? 더 많은 예제와

편집 : 동일한 제어에, 나는 버튼을 얻을 수 있다는 것입니다 나는 comboxbox하고 버튼을하고 난

EventManager.RegisterClassHandler(typeof(MyCtrl) 
           , ComboBox.SelectionChangedEvent 
           , new RoutedEventHandler(OnChanged)); 
EventManager.RegisterClassHandler(typeof(MyCtrl) 
           , Button.ClickEvent 
           , new RoutedEventHandler(OnChanged)); 

문제를 다음과 같이 Button.Click과 ComboBox.SelectionChanged 이벤트를 추적 할 ComboBox 드롭 다운 버튼을 클릭하면 바로 .Click 이벤트가 발생합니다. 이 문제를 어떻게 방지 할 수 있습니까?

?e.OriginalSource 
{System.Windows.Controls.Primitives.ToggleButton Content: 
      IsChecked:True} 
    base {System.Windows.Controls.Primitives.ButtonBase}: 
      {System.Windows.Controls.Primitives.ToggleButton Content: IsChecked:True} 
    IsChecked: true 
    IsThreeState: false 
?e.RoutedEvent 
{ButtonBase.Click} 
    HandlerType: {Name = "RoutedEventHandler" 
        FullName = "System.Windows.RoutedEventHandler"} 
    Name: "Click" 
    OwnerType: {Name = "ButtonBase" 
       FullName = "System.Windows.Controls.Primitives.ButtonBase"} 
    RoutingStrategy: Bubble 

답변

2

나는 이러한 컨트롤은 일반적으로 좋은 일이 같은 이벤트를 재사용하기 때문에이를 방지 할 수 있다고 생각하지 않습니다 여기에

이 이벤트에 대한 몇 가지 추가 정보입니다. 보낸 사람을 기준으로 필터링하고 관심이없는 컨트롤에서 오는 호출을 무시할 수 있습니다.

관련 문제