【问题标题】:Validation in WPF DataGrid not workingWPF DataGrid 中的验证不起作用
【发布时间】:2011-10-10 23:32:37
【问题描述】:

我正在尝试获取在 DataGrid 中验证的 ViewModel 的属性,但我遇到了问题。

我的 XAML 代码如下所示:

<DataGrid x:Name="Items">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Quantity}" Header="Quantity" />
    </DataGrid.Columns>
</DataGrid>

Items-collection(基于 Caliburn.Micro Screen-class)中的 ViewModel-objects 具有如下所示的属性:

public int Quantity
{
    get { return Section.Quantity; }
    set { Section.Quantity = value; }
}

这很好用!如果我在应该是数量的单元格中输入“abc”,则会在文本框周围画一条红线以指示错误。

但是我希望能够稍微操纵 Quantity 值,所以我想改用这段代码:

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 永远不会被捕获,我的应用程序崩溃了......

我尝试修改绑定到 this 没有任何积极的结果:

Binding="{Binding Quantity, Mode=TwoWay, ValidatesOnExceptions=True}"

有什么想法吗?

【问题讨论】:

  • 我要么使用转换器来处理这种事情,要么干脆放弃它。您愿意花多少精力来担心尝试输入“pcs”的人?
  • 我的例子被大大简化了,所以它不仅仅是“pcs”。我担心的文字,我——事后看来——也许应该说清楚。我只是创建了这个例子来保持简单。
  • 好吧,无论如何,这就是转换器的用途。 UIElement 的“属性”窗口中也有类似的情况。您有一个 Width 和 Height 属性。它们采用代表像素的双精度值,但在属性编辑器中,您可以输入以英寸(11 英寸)为单位的尺寸,该尺寸将转换为像素。
  • @Will:我猜你对转换器的预期用途是正确的。在我的真实代码中,我必须验证一堆其他属性,所以我必须创建多个 ValueConverters 和 MultiValueConverters,这就是我想要避免的。此外,在 MVVM 情况下,我希望在 View 的 ViewModel 上进行验证,将放置转换器。

标签: wpf validation mvvm datagrid caliburn.micro


【解决方案1】:

您的 ViewModel 应该实现 IDataErrorInfo 并且您使用该接口来定义您的验证规则

顶部的谷歌链接返回this site,它显示了一个简单的例子来说明它是如何实现的。

【讨论】:

  • 我看了这个acticle 并没有说任何关于 IDataErrorInfo 的内容。显然 Silverlight 和 WPF 中的验证方式不同?
  • @kennethkryger 我相信这篇文章使用 WPF/Silverlight 中的默认异常处理来显示错误。就个人而言,我更喜欢使用IDataErrorInfo,因为它将所有验证都保存在一个中心位置,并且不依赖于抛出异常来显示错误。
猜你喜欢
  • 2014-09-14
  • 2012-12-09
  • 2016-06-19
  • 1970-01-01
  • 2018-09-06
  • 2011-09-29
  • 2011-06-29
  • 2011-02-22
  • 1970-01-01
相关资源
最近更新 更多