我已经按照文章How to: Implement Validation with the DataGrid Control进行了操作,但它并没有阻止用户离开单元格,我希望让细胞集中注意力。考虑绑定到整数值的单元格,尝试输入字母字符将不允许从单元格中删除焦点。
我的网格如下:
<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 :(得分:0)
在您的特殊情况下,您的数据网格没有机会说有什么问题,因为底层数据没有被注意到是错误的。
当你绑定到int类型的VM属性并在你的ui中你将值设置为xyz时 - 那么唯一引发的是bindingexception,但是xyz永远不会归结为你的vm。
是mvvm和wpf中的常见问题。大部分时间我在我的视图模型中使用字符串和IDataErrorInfo接口,并在我的UI中输入蒙版文本框。这样做的好处是我可以处理我的vm IDataErrorInterface中的每个输入。但我还有一些工作要将字符串映射到我的模型的正确类型(例如,在vm中的字符串到模型中的int)。
如果在调试时查看输出窗口,则应该看到bindingexception。
我知道这不是一个真正的答案......