2011-07-01 28 views
0

我跟着文章How to: Implement Validation with the DataGrid Control雖然它不阻止用戶離開細胞,我希望離開細胞集中。考慮綁定到整數值的單元格,嘗試輸入字母字符將不允許將焦點從單元格中移除。如何獲取DataGrid單元格以停止用戶輸入不正確的值?

我格如下:

<DataGrid HeadersVisibility="Column" 
      AutoGenerateColumns="False" 
      CanUserAddRows="False" 
      CanUserDeleteRows="False" 
      CanUserResizeRows="False" 
      ItemsSource="{Binding SelectedLines}"> 
    <DataGrid.RowValidationRules> 
     <ExceptionValidationRule /> 
    </DataGrid.RowValidationRules> 
    <DataGrid.Columns> 
     <DataGridTextColumn IsReadOnly="True" Header="Name" Binding="{Binding Name}"/> 
     <DataGridTextColumn IsReadOnly="False" Header="Qty" 
          Binding="{Binding Quantity, ValidatesOnExceptions=True}"/> 
    </DataGrid.Columns> 
</DataGrid> 

我的數據源是一樣​​的跟隨對象的ObservableCollection

public class MyEntry : INotifyPropertyChanged /*, IEditableObject*/ { 
    public MyEntry(string name) { 
     this.Name = name; 
     this.Quantity = 1; 
    } 
    public string Name { 
     get; 
     private set; 
    } 
    private int quantity; 
    public int Quantity { 
     get { return quantity; } 
     set { 
      if (quantity != value) { 
       if (value < 1) 
        throw new ArgumentException("Quantity may not be less than 1."); 
       if (value > 100) 
        throw new ArgumentException("Quantity may not be more than 100."); 
       quantity = value; 

       OnPropertyChanged("Quantity"); 
      } 
     } 
    } 

    #region INotifyPropertyChanged Members 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected void OnPropertyChanged(string propertyName) { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    #endregion 

    #region IEditableObject Members 
    private int backupQuantity; 
    private bool inEdit; 
    public void BeginEdit() { 
     if (inEdit) return; 
     inEdit = true; 
     backupQuantity = this.Quantity; 
    } 
    public void CancelEdit() { 
     if (!inEdit) return; 
     inEdit = false; 
     this.Quantity = backupQuantity; 
    } 
    public void EndEdit() { 
     if (!inEdit) return; 
     inEdit = false; 
     backupQuantity = 0; 
    } 
    #endregion 
} 

不管我做什麼,電網不顯示有是一個錯誤,即細胞周圍沒有紅框,進一步我想停止用戶離開焦點。如果我在單元格中輸入'x',它的行爲是正確的,但是如果我輸入-1,它不會提交該值,因爲網格不允許我嘗試編輯另一行,並且在原始單元格上按Escape正確地恢復它。

我也想知道是否有一個屬性,網格暴露它是錯誤的,這樣我可以綁定任何驗證,如未啓用接受按鈕。

回答

0

在你的特殊情況下,你的datagrid沒有機會說有什麼問題,因爲底層數據沒有被注意到是錯誤的。

當你綁定到一個類型爲int的VM屬性並且在你的UI中你將值設置爲xyz時 - 那麼唯一引發的是bindingexception,但是xyz永遠不會回落到你的vm中。

其在mvvm和wpf中的一個常見問題。大多數時候我在我的視圖模型中使用字符串和IDataErrorInfo接口,並在我的UI中輸入掩碼的文本框。這樣做的好處是我可以處理我的虛擬機IDataErrorInterface中的每個輸入。但我有更多的工作將字符串映射到我的模型的正確類型(例如vm中的字符串到模型中的int)。

如果您在調試時查看輸出窗口,則應該看到bindingexception。

我知道它不是一個真正的答案...

相關問題