2010-11-25 25 views
5

Geçerli pencerede herhangi bir denetimin (değiştirilip değiştirilmediğini) "Değiştirilmiş "ini izlemek için genel bir yol bulmaya çalışıyorum (örneğin, Uygula düğmesini etkinleştirmek veya devre dışı bırakmak için) Tipik Seçenekler penceresi.) Aslında, ComboBox.SelectionChanged veya TextBox.TextChanged gibi birkaç olay işleyicisini bağlamanız gerekiyor. WinForms'da formdaki bütün kontrollerden geçmem gerekti ve bu olayları tek tek bağladım ve işe yaradı. WPF, ben MyCtrl tüm comboboxes için comobobox seçimi değiştirilen olayı kadar Tel mümkün olacaktır, Bence, bu hat kod ileWPF RoutedEvent (via EventManager.RegisterClassHandler)

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

gibi çok daha az kod ile halletmek düşündüm. Ancak, karşılaştığım problem şu ki, eğer doğru bir şekilde görürsem, bu olay aynı zamanda pencerede bir "combobox" olmayan fakat "Selector" dan türetilen başka bir kontrol olduğunda da tetiklenir. Örneğin, aynı pencerede bir datagridim var (aslında datagrid'de combobox sütunu yok), bu olay farklı bir satır seçtiğimde de tetikleniyor.

Yani, yukarıdaki kod satırının, yalnızca birleşik giriş değil, Selector tabanından türetilen tüm denetimler için SelectionChanged olayına ulaştığı anlaşılıyor.

Bu doğru mu? Tüm combobox'lar için SelectionChanged olayını nasıl bağlayabilirim? Daha fazla örnek ile

DÜZENLEME: Aynı kontrol, ben düğmesi olsun yani ben comboxbox ve bir düğme var ve

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

sorun şu şekilde Button.Click ve ComboBox.SelectionChanged olayı izlemek istiyorsanız ComboBox açılır menüsünü tıkladıktan hemen sonra .Click etkinliği. Bunu nasıl önleyebilirim?

?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 

cevap

2

O kontroller normalde iyi bir şeydir aynı olayları yeniden çünkü bunu engelleyemez sanmıyorum: Burada

bu etkinlik için bazı ekstra bilgilerdir. Gönderene dayalı olarak filtrelemeyi deneyebilir ve ilginizi çekmediğiniz kontrollerden gelen çağrıları göz ardı edebilirsiniz.