私は記事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ボタンが有効になっていないなどの検証をバインドできます。