2010-03-30 28 views
7

Tôi đang tạo một Hộp văn bản số trong WPF, với hai nút để tăng và giảm giá trị.Làm thế nào để ép buộc một sự kiện TextChanged trên một Hộp văn bản WPF và tập trung vào việc tập trung?

Tôi đã tạo hai số RoutedCommand để quản lý ứng xử và chúng hoạt động tốt. Chỉ có một vấn đề mà tôi muốn giải quyết. Tôi muốn rằng điều khiển thông báo cho tất cả các đối tượng liên kết với TextProperty khi lệnh tăng hoặc giảm được thực thi.

Tại thời điểm nó sẽ gửi thông báo chỉ khi tôi thay đổi sự tập trung để kiểm soát khác

Bất kỳ sự giúp đỡ thực sự đánh giá cao, Cảm ơn bạn

Trả lời

11

Sử dụng UpdateSourceTrigger="Explicit" trong Binding và trong TextChanged sự kiện cập nhật BindingSource. vì vậy bạn đang viết một cái gì đó như thế này:

<NumericTextBox x:Name="control" Text={Binding Path=MyProperty}/> 

thay vì làm như thế này

<NumericTextBox x:Name="control" Text={Binding Path=MyProperty, UpdateSourceTrigger=Explicit}/> 

và trong TextChanged xử lý sự kiện cập nhật các ràng buộc.

control.GetBindingExpression(NumericTextBox.TextProperty).UpdateSource(); 

và điều đó được thực hiện. Hy vọng nó sẽ giúp !!

+0

@viky cảm ơn rất nhiều! Tôi quên rằng có thể sử dụng biểu thức "control.GetBindingExpression (NumericTextBox.TextProperty) .UpdateSource();" đó là hoàn hảo. Tôi chỉ gọi nó khi người dùng nhấn nút tăng và giảm và sử dụng hành vi bình thường khi thay đổi văn bản theo cách thủ công. – Drake

+7

Tại sao không chỉ đơn giản là sử dụng 'Text =" {Binding YourBindableProperty, UpdateSourceTrigger = PropertyChanged} "'? –

2

Hành vi mặc định cho việc ràng buộc thuộc tính Văn bản trên TextBox là cập nhật trên LostFocus. Bạn có thể thay đổi điều này trong điều khiển tùy chỉnh của bạn bằng cách ghi đè các siêu dữ liệu trên TextProperty trong ctor tĩnh của bạn:

static NumericTextBox() 
{ 
    TextProperty.OverrideMetadata(
     typeof(NumericTextBox), 
     new FrameworkPropertyMetadata("", // default value 
      FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, 
      null, // property change callback 
      null, // coercion callback 
      true, // prohibits animation 
      UpdateSourceTrigger.PropertyChanged)); 
} 
+0

@abe cảm ơn bạn Abe, câu trả lời rất hữu ích nhưng viky là linh hoạt hơn cho trường hợp của tôi – Drake

25

Có một cách đơn giản:

Text="{Binding Path=MyProperty, UpdateSourceTrigger=PropertyChanged}" 

(Tôi đã thử nghiệm nó trên TextBox). Chúc may mắn

+1

+1. 'Text =" {Ràng buộc MyTextProperty, UpdateSourceTrigger = PropertyChanged} "' có vẻ là cách tốt nhất để đi. –

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