Soru Düzenlenebilir bir ComboBox'tan TextChanged olaylarını nasıl alabilirim


Düzenlenebilir bir ComboBox'ım var:

<ComboBox IsEditable="true"/>

Düzenlenen değer değiştirildiğinde, ortaya çıkan olay nedir? TextInput'u denedim ama bu çözüm değil.


44
2017-08-02 15:59


Menşei


TextChanged olayını deneyin ve işe yarayıp yaramadığını görün. - Shamim Hafiz


Cevaplar:


<ComboBox IsEditable="True" TextBoxBase.TextChanged="ComboBox_TextChanged" />

...yapmalı. (Metne bir değişiklik yapıldığında her seferinde ateşlenecek bir şey istediğinizi varsayarsak, o zaman kullanıcı metni girmeyi bitirdi. Bu durumda başka bir olaya ihtiyacın olabilir - belki bir LostFocus olayı veya başka bir şey?)

Her neyse, yukarıdaki XAML çalışmalarının nedeni, IsEditable true olarak ayarlandığında, ComboBox metnin görüntülenmesi ve düzenlenmesi için bir TextBox kullanır. TextBox'ın TextChanged olayı bir köpüren olay - Yani element ağacından yukarı doğru hareket eder, bu yüzden ComboBox'ın kendisinde halledebiliriz.

Tek 'zor' bit, ComboBox'ın bir TextChanged olayının kendisini göstermemesidir, ancak yine de bunun için bir işleyici tanımlayabilirsiniz. ekli etkinlik (Bu nedenle TextBoxBase.TextChanged sözdizimi).

(Muhtemelen bütünlük için kayda değerdir, ComboBox birden fazla TextBox içeriyorsa, herhangi biri, metinleri değiştiğinde işleyici çağrılırdı.)


101
2017-08-02 16:14



Neden Combobox'ın TextBox türünü hedefleyen ve TextChanged için bir etkinlik ayarlayıcıya sahip olan kaynaklara neden aynı şeyi gerçekleştiremediyse? Bu işe yaramazsa, ilk düşüncem oldu. Çözümün işe yarıyor, ama neden alternatifimin anlamadığını merak ediyordum. - Mike G
@MikeG: Güzel soru. Bu yaklaşımın işe yarayacağını düşünüyorum, ancak sadece TextBox başka bir stil uygulamıyorsa. ComboBox'ın kontrol şablonunun, stilinizi geçersiz kılan TextBox'ta bir stil belirlediğinden şüpheleniyorum. - IanR
Durumun böyle olup olmadığını görmek için Snoop'a bakmadım, ama eminim ki ComboBox'ın varsayılan TextBox stilini geçersiz kıldığı varsayımıyla haklısın. TextChanged'in ComboBox tarafından işlevsellik açısından dahili olarak kullanıldığını hayal etmek zorundayım. Bence ekli mülkleri kullanılmak üzere tasarlandıkları şekilde kullanabileceğine inanıyorum çünkü çözümünüzün "daha doğru / eksiksiz" olduğunu düşünüyorum. - Mike G
Bunu denediğimde Failed to created a 'TextChanged' from the text 'ComboBox_TextChanged' ben değiştirsem bile ComboBox uygun olan x:Name değer. - Jonathan Leech-Pepin


Yukarıdaki yaklaşıma dayanarak, (XAML) tarafından oluşturulan kodun bir örneğini inceledim.

<ComboBox x:Name="myComboBox" IsEditable="True"/>

Başlatma için aşağıdaki kodu ekleyin:

myComboBox.AddHandler(System.Windows.Controls.Primitives.TextBoxBase.TextChangedEvent, 
                      new System.Windows.Controls.TextChangedEventHandler(ComboBox_TextChanged));

Bu benim için iyi çalışıyor çünkü tüm davranışları kapsülleyen yeniden kullanılabilir bir ComboBox'a (SQL-Server açılan listesi) ihtiyacım vardı.


16
2018-03-05 08:46



Bu çalışmayı özellikle TextChanged olayı için harika buldum, ancak ComboBox'ın SelectionChanged olayı ve TextBox'un SelectionChanged olayı arasındaki belirsizlik nedeniyle SelectionChanged olayıyla çalışmaz. Bu özel etkinlik için benzer bir şey yapmak mümkün mü? - Bobby Byrnes