WPF DataGrid中的验证不起作用

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中验证ViewModel的属性,但遇到了一个问题

我的XAML代码如下所示:

<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
,因为它将所有验证保存在一个中心位置,并且不依赖于抛出异常来显示错误。