2011-08-02 4 views

답변

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

...해야합니다. (사용자가 텍스트 입력을 마칠 때마다 텍스트가 변경 될 때마다 실행되는 무언가를 원한다고 가정 할 경우 LostFocus 이벤트 또는 다른 이벤트가 필요할 수 있습니다.)

어쨌든 위의 XAML이 작동하는 이유는 IsEditable을 true로 설정하면 ComboBox가 텍스트를 표시하고 편집하기 위해 TextBox를 사용한다는 것입니다. TextBox의 TextChanged 이벤트는 bubbling event입니다. 즉 ComboBox 자체에서 처리 할 수 ​​있도록 요소 트리를 통해 위로 튀어 나옵니다.

유일한 '까다로운'점은 ComboBox가 TextChanged 이벤트 자체를 노출하지 않지만 attached event (따라서 TextBoxBase.TextChanged 구문)을 사용하여 해당 핸들러를 정의 할 수 있다는 것입니다.

는 (그것은 콤보 상자가 다음 핸들러가 호출됩니다 하나 이상의 텍스트 상자를 포함 할 일이 있다면 그 중 하나가 자신의 텍스트를 변경했다 때마다 것을, 완성도에 대한 지적 아마 가치가있다.) 내가 가진 위

+0

왜 TextBox의 대상 유형과 TextChanged에 대한 이벤트 설정자가 동일한 작업을 수행하지 못하게하는 콤보 상자의 리소스에 스타일을 추가하겠습니까? 이것이 작동하지 않는다는 것을 알 때까지 이것은 내 생각이었습니다. 당신의 솔루션은 효과가 있지만 왜 대안이 아닌지 궁금해하고있었습니다. –

+2

@MikeG : 좋은 질문입니다. 그 접근 방식이 효과가 있다고 생각하지만, TextBox가 다른 스타일을 적용하지 않는 경우에만 그렇습니다. 나는 ComboBox의 컨트롤 템플릿이 자신의 스타일을 재정의하는 TextBox에 스타일을 설정했다고 의심합니다. – IanR

+0

스눕 (Snoop)에서 스누프를 살펴 보지 않았지만 ComboBox가 기본 TextBox 스타일을 재정의한다고 가정합니다. TextChanged가 ComboBox의 기능을 위해 내부적으로 사용되는 것을 상상해야합니다. 나는 당신의 솔루션이 "정확하고 완전하다"고 생각한다. 왜냐하면 나는 그것이 사용되도록 고안된 방식으로 연결된 속성을 사용한다고 믿는다는 사실 때문이다. –

14

접근 방식을 기반으로 (XAML) 생성 된 코드를 살펴보십시오.

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

초기화에 다음 코드를 추가합니다 :

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

내가 재사용 가능한 콤보 (SQL-서버 드롭 다운 목록)을 필요로했기 때문에 이것은 나를 위해 잘 작동하는 모든 동작을 캡슐화한다.

+0

특히이 기능은 TextChanged 이벤트에 유용하지만 ComboBox의 SelectionChanged 이벤트와 TextBox의 SelectionChanged 이벤트 사이의 모호함 때문에 SelectionChanged 이벤트와 함께 작동하지 않습니다. 특정 이벤트와 유사한 작업을 수행 할 수 있습니까? –

관련 문제