2008-09-04 60 views
1

我有一個數據綁定文本框在我的應用程序,如下所示:(類型的Heightdecimal?斯特朗驗證在WPF

<TextBox Text="{Binding Height, UpdateSourceTrigger=PropertyChanged, 
         ValidatesOnExceptions=True, 
         Converter={StaticResource NullConverter}}" /> 

public class NullableConverter : IValueConverter { 
    public object Convert(object o, Type type, object parameter, CultureInfo culture) { 
     return o; 
    } 

    public object ConvertBack(object o, Type type, object parameter, CultureInfo culture) { 
     if (o as string == null || (o as string).Trim() == string.Empty) 
      return null; 
     return o; 
    } 
} 

配置這種方式,任何非空字符串不能在轉換爲十進制結果驗證錯誤將立即突出顯示文本框。但是,TextBox仍可能失去焦點並保持無效狀態。我想要做的是:

  1. 不允許TextBox失去焦點,直到它包含有效值。
  2. 將文本框中的值還原爲最後一個有效值。

這樣做的最好方法是什麼?

更新:

我已經找到了一種方法來做到#2。我不喜歡它,但它的作品:

private void TextBox_LostKeyboardFocus(object sender, RoutedEventArgs e) { 
    var box = sender as TextBox; 
    var binding = box.GetBindingExpression(TextBox.TextProperty); 
    if (binding.HasError) 
     binding.UpdateTarget(); 
} 

有沒有人知道如何做到這一點更好? (或做#1)

回答

2

您可以強制鍵盤焦點通過處理PreviewLostKeyBoardFocus事件像這樣留在TextBox

<TextBox PreviewLostKeyboardFocus="TextBox_PreviewLostKeyboardFocus" /> 

private void TextBox_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) { 
    e.Handled = true; 
} 
0

這聽起來對我說,你要處理兩個事件:

的GotFocus:當文本框獲得焦點將觸發。您可以存儲該框的初始值。

LostFocus:當文本框失去焦點時將觸發。在這一點上,你可以做你的驗證,並決定是否要回滾或不回滾。