2012-04-04 30 views
2

我有一個形式簡單的WinForms應用程序,一些控件和這樣定義的業務對象:防止將無效文本框輸入綁定到業務對象屬性?

public class BusinessObject : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(PropertyChangedEventArgs e) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, e); 
     } 
    } 

    private string _phoneNumber; 
    public string PhoneNumber 
    { 
     get { return _phoneNumber; } 
     set 
     { 
      if (_phoneNumber == value) 
      { 
       return; 
      } 

      _phoneNumber = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("PhoneNumber")); 
     } 
    } 

在我的形式,我有一個通過綁定源綁定到******中國房地產的文本框和數據源更新模式設置爲OnPropertyChanged。這一切都按預期工作。在將文本分配給業務對象上的PhoneNumber屬性之前,我需要對文本進行一些驗證。我認爲我會在文本框的驗證事件處理程序中執行此操作,如果輸入無效,則顯示錯誤提供程序並設置e.Cancel = true。不幸的是,這並不能防止綁定到PhoneNumber屬性的無效輸入。是否有捷徑可尋?

+1

由於您將更新模式設置爲OnPropertyChanged,這意味着數據會在每個擊鍵上被推送到對象。你的驗證邏輯如何處理?我的意思是,你不應該等到用戶在驗證之前完成輸入數字嗎? – 2012-04-05 00:12:40

+0

你是對的。 :-(文本框的目的是爲用戶輸入一個未格式化的電話號碼(通過未格式化,我的意思是隻有數字,沒有+符號,破折號,parens等)我目前沒有做任何類型的輸入過濾keydown或按鍵,這樣他們就可以輸入ABC並且它會接受它,並且,正如你所指出的那樣,使用OnPropertyChanged,在我可以驗證它之前,該輸入會被推送到每個擊鍵上的對象上,我想我應該使用更新模式對此文本框的OnValidation? – user685869 2012-04-05 13:01:04

回答

1

正如mrlucmorin所建議的,我已將更新數據源模式從「OnPropertyChanged」更改爲「OnValidation」,以便綁定僅在文本框丟失並得到驗證時纔會發生。我在我的文本框的Validating()事件處理程序中實現了驗證,並在數據無效時設置e.Cancel = true。不幸的是,單擊工具欄上的按鈕似乎不會導致文本框失去焦點,所以Validating()事件從不會觸發,但是我可以通過在單擊工具欄按鈕時調用ValidateChildren()來解決此問題。再次感謝mrlucmorin和ImGreg的建議,最終解決了我的問題!

0

根據msdn,您正在使用的事件發生在值更改後。一種選擇是存儲數據的備份並恢復更改的值。但是,這不是一個理想的方法。

我會改變你如何驗證控件。

我不確定什麼時候這樣做,因爲它取決於您的代碼如何工作。也許在你失去對文本框控件的關注時執行你自己的驗證,或者當數據源被更新時進行驗證。

編輯:也許你正在尋找ErrorProvider Class。這可以用來像你想要的那樣處理驗證。

+0

感謝您的建議! – user685869 2012-04-09 12:59:18

1

Data Validation可能只是你正在尋找的東西。應該保持無效的輸入來改變你的對象。

+0

謝謝你的尖叫。我之前通過Google搜索遇到過這種情況,但它看起來像適用於WPF。 – user685869 2012-04-04 19:37:27

+0

meh,傻我,沒有看到你使用winforms。將不會真的工作。 – shriek 2012-04-04 20:24:54

+0

請參閱我的編輯@ user685869。 – ImGreg 2012-04-04 21:27:18

相關問題