2010-11-25 6 views
5

現在のウィンドウ内の任意のコントロール(databindまたはnot)の "Modified"を追跡する一般的な方法を見つけることを試みています(これは、実際には、ComboBox.SelectionChangedやTextBox.TextChangedのようないくつかのイベントハンドラを接続する必要があります。 WinFormsでは、フォームのすべてのコントロールをループして、それらのイベントを1つずつフックアップしなければなりませんでした。 WPFでは、私はそれがこの1行のコードでWPF RoutedEvent(EventManager.RegisterClassHandler経由)

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

のようなはるかに少ないコードで片付けることができると思って、私はMyCtrl内のすべてのコンボボックス用comoboboxの選択変更イベントを配線することができるだろう。しかし、私が遭遇した問題は、正しく表示すると、コンボボックスではなく「Selector」から派生した別のコントロールがウィンドウにあるときにもこのイベントが発生するということです。たとえば、同じウィンドウにデータグリッドもあります(実際にはデータグリッドにコンボボックスの列はありません)。このイベントは別の行を選択すると発生します。

したがって、上記のコード行は、コンボボックスだけでなく、Selectorから派生したすべてのコントロールのSelectionChangedイベントをフックアップするようです。

これは正しいですか?すべてのコンボボックスに対してSelectionChangedイベントを接続するにはどうすればよいですか?より多くの例で

EDIT:

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

を次のように同じ制御では、私はcomboxbox、ボタンを持っていると私は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

私は通常、良いことである、これらのコントロールは、同じイベントを再利用するので、あなたはこれを防ぐことができないと思います。あなたは、送信者に基づいてフィルタリングを試み、あなたが興味のないコントロールからの呼び出しを無視することができます。

関連する問題