2011-11-18 34 views
6

Tôi đang sử dụng TextBox của WPF với một ràng buộc trên các tài sản văn bản để tăng gấp đôi trên ViewModel của tôi.Ràng buộc với một đôi với StringFormat trên một TextBox

My XAML trông như thế này:

<TextBox Text="{Binding Path=MyDoubleValue, StringFormat=N2, UpdateSourceTrigger=PropertyChanged}" /> 

Thật không may khi tôi chuyển UpdateSourceTrigger để PropertyChanged và kiểu giá trị 12345, tôi nhận được 12,354.00 (EDIT: chú ý đến 5 trước 4). Đây là kết quả của việc giữ con trỏ ở cùng một vị trí sau khi thêm , giữa 23 bởi trình định dạng .NET.

Tôi làm cách nào để sử dụng StringFormat với UpdateSourceTrigger được đặt thành PropertyChanged?

Lưu ý: Đây chỉ xảy ra trong .NET 4.

+1

Có phải 12,345,00 không phải là điều bạn mong đợi khi sử dụng StrngFormat N2? Bạn mong chờ điều gì? – Jens

+0

Có chính xác, nhưng thay vì nhận được rằng tôi có 12,354,00. – baalazamon

+0

Chuỗi định dạng sẽ không làm cho các chữ số chuyển đổi như thế, phải có cái gì khác đang diễn ra trên –

Trả lời

8

Thông thường, bạn không muốn UpdateSourceTriggerPropertyChanged trên TextBox.Text ràng buộc vì đây gây nên các Validation và Thay đổi thông báo mỗi khi một phím được nhấn.

Nếu bạn đang làm điều này chỉ để nếu người dùng nhấn Enter, nó sẽ lưu giá trị trước khi xử lý lệnh lưu, sau đó tôi khuyên bạn nên gắn vào sự kiện PreviewKeyDown và cập nhật thủ công nguồn nếu phím được nhấn Enter (thường thì tôi làm cho một AttachedProperty)

private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Enter) 
    { 
     var obj = sender as UIElement; 
     BindingExpression textBinding = BindingOperations.GetBindingExpression(
      obj, TextBox.TextProperty); 

     if (textBinding != null) 
      textBinding.UpdateSource(); 
    } 
} 

nhưng với điều đó đang được nói, nếu bạn vẫn muốn sử dụng UpdateSourceTrigger=PropertyChanged, sau đó xem xét sử dụng các định dạng khi hiển thị các giá trị, nhưng loại bỏ nó khi người dùng đang chỉnh sửa nó.

<TextBox> 
    <TextBox.Style> 
     <Style TargetType="{x:Type TextBox}"> 
      <Setter Property="Text" Value="{Binding Path=MyDoubleValue, StringFormat=N2}" /> 
      <Style.Triggers> 
       <Trigger Property="IsFocused" Value="True"> 
        <Setter Property="Text" Value="{Binding Path=MyDoubleValue, UpdateSourceTrigger=PropertyChanged}" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </TextBox.Style> 
</TextBox> 
+0

Bạn có bất kỳ ý tưởng làm thế nào để đạt được một cái gì đó tương tự với các bộ chuyển đổi? Các giải pháp hoàn hảo sẽ có một công cụ chuyển đổi mà đang làm định dạng chỉ khi điều khiển không tập trung – baalazamon

+0

@baalazamon Bạn có thể tạo một StringFormat đa chuyển đổi mà trả về 'value.ToString (converterParameter)' nếu điều khiển 'IsFocused', tuy nhiên tôi nghĩ rằng DataTriggers là một cách tốt hơn để đi trong trường hợp này – Rachel

+4

Vì một số lý do, sử dụng giải pháp này, nếu tôi nhập "2.5" vào một 'TextBox' trống, tôi nhận được" 25 ", số thập phân không xuất hiện. Nếu tôi định vị lại con trỏ ở bất kỳ đâu ngoại trừ bên phải, thì tôi có thể nhập số thập phân. – epalm

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