2013-08-28 227 views
0

我使用WPF MVVM IM我的項目之一。我有一個我綁定到對象列表的數據網格。處理錯誤

<DataGrid ItemsSource="{Binding Path=ListOfValues}" Margin="5,38" 

在我的視圖模型類我有ListOfValues

public ObservableCollection<ClassA> ListOfValues 
     { 
      get { return listOfValues; } 
      set 
      { 
       listOfValues= value; 
       RaisePropertyChangedEvent("ListOfValues"); 
      } 
     } 

在我的ClassA的財產,我有三個特性。

public string Name { get; set; } 
public long No { get; set; }   
public decimal Amount { get; set; } 

在網格中,用戶只能輸入Amount字段的值。我想驗證用戶是否輸入該字段的有效十進制值。

推薦我一個地方,我能趕上execption。我試圖在窗口關閉時處理它。但是如果用戶輸入了無效值,那麼它沒有保存在視圖的數據上下文中。此外,我試圖驗證它的ClassA中的二傳手它沒有擊中值的制定者。

+0

你如何做驗證?你使用IDataErrorInfo接口? – sevdalone

+0

不,我不是使用IDataErrorInfo – udaya726

+0

我建議你爲你ClassA實現IDataErrorInfo接口和INotifyPropertyChanged接口。 – sevdalone

回答

0

也許你可以從不同的角度攻擊這個問題...怎麼樣進入任何非數字字符到停止用戶TextBox在第一位?

爲此,您可以使用PreviewTextInputPreviewKeyDown事件......有關附加處理程序的TextBox和這段代碼添加到他們:如果你想採取重一點時間

public void TextCompositionEventHandler(object sender, TextCompositionEventArgs e) 
{ 
    // if the last pressed key is not a number or a full stop, ignore it 
    return e.Handled = !e.Text.All(c => Char.IsNumber(c) || c == '.'); 
} 

public void PreviewKeyDownEventHandler(object sender, KeyEventArgs e) 
{ 
    // if the last pressed key is a space, ignore it 
    return e.Handled = e.Key == Key.Space; 
} 

可用性,你可以把它放到一個Attached Property ...這是很好能夠添加此功能的屬性:

<TextBox Text="{Binding Price}" Attached:TextBoxProperties.IsDecimalOnly="True" /> 
+0

嗨,它是一個數據網格中的一個列而不是一個文本框 – udaya726

+0

「文本框」只是顯示瞭如何在包裝在「附加屬性」中時使用此功能。但是,您可以添加一個'DataGridTemplateColumn',爲其定義一個'DataTemplate'並在其中包含'TextBox'並將這些處理程序附加到該'TextBox'。有關詳細信息,請參閱MSDN中的[DataGridTemplateColumn類](http://msdn.microsoft.com/zh-cn/library/system.windows.controls.datagridtemplatecolumn.aspx)頁面。 – Sheridan

+0

我已經使用PreviewTextInput操作來限制輸入。謝謝 – udaya726

0

我強烈建議你實現你的數據類型的類IDataErrorInfo接口。你可以找到它here一個完整的教程,但基本而言,這是它如何工作的。

我們需要一個indexer添加到每個班級:

public string this[string columnName] 
{ 
    get 
    { 
     string result = null; 
     if (columnName == "FirstName") 
     { 
      if (string.IsNullOrEmpty(FirstName)) 
       result = "Please enter a First Name"; 
     } 
     if (columnName == "LastName") 
     { 
      if (string.IsNullOrEmpty(LastName)) 
       result = "Please enter a Last Name"; 
     } 
     return result; 
    } 
} 

從鏈接教程

採取了這種indexer,我們增加我們的驗證要求依次每個屬性。您可以添加多重要求每個屬性:

 if (columnName == "FirstName") 
     { 
      if (string.IsNullOrEmpty(FirstName)) result = "Please enter a First Name"; 
      else if (FirstName.Length < 3) result = "That name is too short my friend"; 
     } 

無論你在result參數返回作爲UI中的錯誤消息。爲了這個工作,你需要添加到您的binding值:

Text="{Binding FirstName, ValidatesOnDataErrors=true, NotifyOnValidationError=true}" 
+0

謝謝謝里登。如果列類型是字符串,你的代碼對我來說很好。但是對於小數列,它只顯示紅色邊框。 – udaya726