2011-08-02 33 views

Trả lời

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

... nên làm điều đó. (Giả sử bạn muốn thứ gì đó sẽ kích hoạt mỗi lần thay đổi được thực hiện cho văn bản, thay vào đó khi người dùng đã nhập xong văn bản. Trong trường hợp đó bạn cần một sự kiện khác - có thể là sự kiện LostFocus hoặc một cái gì đó?)

Dù sao, lý do tại sao XAML ở trên hoạt động là, khi IsEditable được đặt thành true, ComboBox sử dụng một TextBox để hiển thị và chỉnh sửa văn bản. Sự kiện TextChanged của TextBox là bubbling event - có nghĩa là nó sẽ bong bóng lên qua cây phần tử để chúng ta có thể xử lý nó trên chính ComboBox.

Bit duy nhất 'khó hiểu' là ComboBox không hiển thị sự kiện TextChanged nhưng bạn vẫn có thể xác định trình xử lý cho nó bằng cách sử dụng attached event (do đó cú pháp TextBoxBase.TextChanged).

(Có lẽ đáng chú ý cho đầy đủ, rằng nếu các ComboBox xảy ra với chứa nhiều hơn một TextBox sau đó xử lý sẽ được gọi bất cứ khi nào trong số họ đã văn bản của họ đã thay đổi.)

+0

Tại sao lại thêm kiểu dáng vào tài nguyên của combobox nhắm mục tiêu kiểu TextBox và có trình thiết lập sự kiện cho TextChanged không thực hiện được điều tương tự? Đây là suy nghĩ đầu tiên của tôi cho đến khi tôi thấy nó không hoạt động. Giải pháp của bạn hoạt động, nhưng đã tự hỏi tại sao lựa chọn thay thế của tôi lại không. –

+2

@MikeG: Câu hỏi hay. Tôi nghĩ rằng cách tiếp cận đó sẽ hiệu quả, nhưng chỉ khi TextBox không nhận được một phong cách khác được áp dụng cho nó. Tôi nghi ngờ rằng mẫu kiểm soát của ComboBox đặt một phong cách trên TextBox đó là trọng phong cách của bạn. – IanR

+0

Tôi đã không xem xét Snoop để xem nếu đó là trường hợp, nhưng tôi đặt cược bạn đúng với giả định rằng ComboBox là trọng các phong cách TextBox mặc định. Tôi phải tưởng tượng rằng TextChanged được sử dụng nội bộ bởi ComboBox cho chức năng của nó. Tôi nghĩ rằng giải pháp của bạn là "chính xác hơn/hoàn thành" do thực tế là tôi tin rằng nó thúc đẩy các thuộc tính đính kèm theo cách mà chúng được thiết kế để được sử dụng. –

14

Dựa trên cách tiếp cận trên, chúng tôi đã xem xét mã được tạo (XAML).

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

Thêm mã sau đây để khởi tạo:

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

này hoạt động tốt đối với tôi, bởi vì tôi cần một ComboBox thể tái sử dụng (danh sách thả xuống SQL-Server) mà gói gọn tất cả hành vi.

+0

Tôi đã tìm thấy công trình này tuyệt vời cho sự kiện TextChanged nói riêng, nhưng nó không hoạt động với sự kiện SelectionChanged, có khả năng do sự mơ hồ giữa sự kiện SelectionChanged của ComboBox và sự kiện SelectionChanged của TextBox. Có thể làm điều gì đó tương tự cho sự kiện cụ thể đó không? –

Các vấn đề liên quan