2011-07-01 15 views
0

私は記事How to: Implement Validation with the DataGrid Controlに従っていますが、ユーザーがセルを離れるのを妨げるものではありません。私はセルをフォーカスしたままにしておきたいと思います。整数値にバインドされているセルを考えて、アルファ文字を入力しようとすると、セルからフォーカスを削除できません。次のようにユーザーが誤った値を入力するのを防ぐためにDataGrid Cellを取得するにはどうすればよいですか?

私のグリッドは、次のとおりです。

<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を押すと正しい値に戻ります。

グリッドがエラーであることを示すプロパティがあるかどうかを知りたい場合は、このようにしてAcceptボタンが有効になっていないなどの検証をバインドできます。

答えて

0

あなたの特別なケースでは、あなたのデータグリッドは何か間違っていると言える機会がありません。なぜなら、基礎となるデータが何か間違っていることに気付かないからです。

int型のVMプロパティにバインドし、値をxyzに設定した場合、唯一起こるのはバインディング例外ですが、xyzはあなたのVMに決して送られません。

mvvmとwpfによくある問題です。ほとんどの時間私は文字列とIDataErrorInfoインターフェイスを私のビューモデルで使用し、私のUIの入力用のテキストボックスをマスクします。これの利点は、私はすべての入力私のVM IDataErrorInterfaceを処理できることです。しかし、私は文字列を私のモデルの正しい型(例えば、モデルのint型のvmの文字列)にマップする作業が少ししかありません。

デバッグ中に出力ウィンドウを見ると、bindingexceptionが表示されます。

実際の答えはわかりません...

関連する問題