WPF DataGrid中的验证不起作用
我试图在DataGrid中验证ViewModel的属性,但遇到了一个问题 我的XAML代码如下所示:WPF DataGrid中的验证不起作用,wpf,validation,mvvm,datagrid,caliburn.micro,Wpf,Validation,Mvvm,Datagrid,Caliburn.micro,我试图在DataGrid中验证ViewModel的属性,但遇到了一个问题 我的XAML代码如下所示: <DataGrid x:Name="Items"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding Quantity}" Header="Quantity" /> </DataGrid.Columns> </DataGrid> publi
<DataGrid x:Name="Items">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Quantity}" Header="Quantity" />
</DataGrid.Columns>
</DataGrid>
public int Quantity
{
get { return Section.Quantity; }
set { Section.Quantity = value; }
}
这太棒了!如果我在应该输入数量的单元格中输入“abc”,则文本框周围会画一条红线以指示错误
但是,我希望能够操纵一个小的数量值,因此我想使用以下代码:
public string Quantity
{
get { return string.Format("{0} pcs.", Section.Quantity); }
set
{
var quantityAsText = value.Replace("pcs.", string.Empty).Trim();
int quantity;
if (int.TryParse(quantityAsText, out quantity))
{
Section.Quantity = quantity;
NotifyOfPropertyChange(() => Quantity);
}
else
{
throw new FormatException("Quantity must be a number!");
}
}
}
然而,这不起作用。FormatException从未被捕获,我的应用程序崩溃
我已尝试修改此绑定,但没有任何积极结果:
Binding="{Binding Quantity, Mode=TwoWay, ValidatesOnExceptions=True}"
有什么想法吗?您的视图模型应该实现
IDataErrorInfo
,并使用该接口定义验证规则
返回的顶部google链接显示了如何实现的简单示例。您的ViewModel应该实现
IDataErrorInfo
,您可以使用该接口定义验证规则
返回的顶部google链接显示了一个简单的示例,说明了它是如何实现的。我要么使用转换器来处理这类事情,要么干脆放弃它。你想花多少精力去担心那些试图输入“PC”的人?我的例子大大简化了,所以它实际上不仅仅是“PC”。我担心的是文本,事后看来,我也许应该说清楚。我只是创建了这个例子来保持简单。好吧,不管怎样,这就是转换器的用途。UIElement的属性窗口中也存在类似的情况。您具有宽度和高度属性。它们采用双精度,表示像素,但在属性编辑器中,您可以输入一个以英寸(11英寸)为单位的大小,该大小将转换为像素。@威尔:我想您对转换器的预期用途是正确的。在我的实际代码中,我必须再次验证一系列其他属性,因此我必须创建多值转换器和多值转换器,这就是我想要避免的。另外,在MVVM情况下,我希望在视图模型上进行验证,而不是在视图上进行验证,在视图中放置转换器。我要么使用转换器来处理这类事情,要么干脆放弃它。你想花多少精力去担心那些试图输入“PC”的人?我的例子大大简化了,所以它实际上不仅仅是“PC”。我担心的是文本,事后看来,我也许应该说清楚。我只是创建了这个例子来保持简单。好吧,不管怎样,这就是转换器的用途。UIElement的属性窗口中也存在类似的情况。您具有宽度和高度属性。它们采用双精度,表示像素,但在属性编辑器中,您可以输入一个以英寸(11英寸)为单位的大小,该大小将转换为像素。@威尔:我想您对转换器的预期用途是正确的。在我的实际代码中,我必须再次验证一系列其他属性,因此我必须创建多值转换器和多值转换器,这就是我想要避免的。另外,在MVVM的情况下,我希望在视图模型上进行验证,而不是在视图上进行验证,在视图中,转换器将被放置在哪里。Silverlight和WPF中的验证方式显然不同?@kennethkryger我相信本文使用WPF/Silverlight中的默认异常处理来显示错误。就我个人而言,我更喜欢使用
IDataErrorInfo
,因为它将所有验证都保存在一个中心位置,并且不依赖于抛出异常来显示错误。我看了这个,那个并没有说任何关于IDataErrorInfo的事。Silverlight和WPF中的验证方式显然不同?@kennethkryger我相信本文使用WPF/Silverlight中的默认异常处理来显示错误。就我个人而言,我更喜欢使用IDataErrorInfo
,因为它将所有验证保存在一个中心位置,并且不依赖于抛出异常来显示错误。